C++學(xué)習(xí)筆記

字符串問題

字符串

在定義字符串?dāng)?shù)組時(shí),C有兩種定義方法:


char* str1 = "0123456789";

char string[10];

在第一種定義中,雖然只有10個字符,但是使用了11個字節(jié)來保存。最后一個字節(jié)為`\0`

當(dāng)進(jìn)行strcpy的時(shí)候,strcpy(string,str1) 這樣就會導(dǎo)致數(shù)組越界。

在進(jìn)行字符串拷貝時(shí):


void test2()

{

char string[10], str1[10];

int i;

for(i=0; i < 10; i++)

{

str1  = 'a';

}

strcpy( string, str1 );

}

使用庫函數(shù)strcpy進(jìn)行拷貝操作,strcpy會從原地址一直往后拷貝,直到遇見'\0'為止。所以拷貝的長度是不定的。如果一直沒有遇到'\0'導(dǎo)致越界訪問非法內(nèi)存,程序就崩潰了。


strcpy的實(shí)現(xiàn)

如果編寫一個標(biāo)準(zhǔn)strcpy函數(shù)的總分值為10,下面給出幾個不同得分的答案:

2分


void strcpy( char *strDest, char *strSrc )

{

while( (*strDest++ = * strSrc++) != ‘\0’ );

}

4分


void strcpy( char *strDest, const char *strSrc )

//將源字符串加const,表明其為輸入?yún)?shù),加2分

{

while( (*strDest++ = * strSrc++) != ‘\0’ );

}

7分


void strcpy(char *strDest, const char *strSrc)

{

//對源地址和目的地址加非0斷言,加3分

assert( (strDest != NULL) && (strSrc != NULL) );

while( (*strDest++ = * strSrc++) != ‘\0’ );

}

10分


//為了實(shí)現(xiàn)鏈?zhǔn)讲僮?,將目的地址返回,?分!

char * strcpy( char *strDest, const char *strSrc )

{

assert( (strDest != NULL) && (strSrc != NULL) );

char *address = strDest;

while( (*strDest++ = * strSrc++) != ‘\0’ );

return address;

}


第五題

檢查下面代碼有什么問題


void GetMemory( char *p )

{

p = (char *) malloc( 100 );

}

void Test( void )

{

char *str = NULL;

GetMemory( str );

strcpy( str, "hello world" );

printf( str );

}

GetMemory(char *p)函數(shù)中的形參為字符串指針,函數(shù)內(nèi)部修改形參的值并不能真正的改變傳入的參數(shù)值。在取得地址后并沒有返回,所以str指針仍然是NULL。


第六題

下面代碼會出什么問題


char *GetMemory( void )

{

char p[] = "hello world";

return p;

}

void Test( void )

{

char *str = NULL;

str = GetMemory();

printf( str );

}

p[]數(shù)組為函數(shù)內(nèi)的局部自動變量,在函數(shù)返回后,內(nèi)存已經(jīng)被釋放。這是許多程序員常犯的錯誤,其根源在于不理解變量的生存期。


第七題

下面代碼會出什么問題


void GetMemory( char **p, int num )

{

*p = (char *) malloc( num );

}

void Test( void )

{

char *str = NULL;

GetMemory( &str, 100 );

strcpy( str, "hello" );

printf( str );

}

  1. 傳入GetMemory的參數(shù)為字符串指針的指針,但是在GetMemory中執(zhí)行申請內(nèi)存及賦值語句*p = (char *)malloc(num);后沒有判斷內(nèi)存是否申請成功,應(yīng)加上:

if ( *p == NULL )

{

...//進(jìn)行申請內(nèi)存失敗處理

}

  1. 未釋放內(nèi)存

  2. printf(str) 改為printf("%s",str),否則可使用格式化字符串攻擊。


第八題

下面代碼會出什么問題


void Test( void )

{

char *str = (char *) malloc( 100 );

strcpy( str, "hello" );

free( str );

... //省略的其它語句

}

沒有進(jìn)行判斷內(nèi)存是否申請成功;

在free(str)后沒有把str置為空,可能會成為一個野指針。應(yīng)當(dāng)加上str=NULL;


第九題

下面代碼會出什么問題


swap( int* p1,int* p2 )

{

int *p;

*p = *p1;

*p1 = *p2;

*p2 = *p;

}

需要返回值

p是一個野指針,有可能指向系統(tǒng)區(qū),應(yīng)該改為:


void swap( int* p1,int* p2 )

{

int p;

p = *p1;

*p1 = *p2;

*p2 = p;

}


如何判斷flot類型變量是否為零

const float EPSINON = 0.00001;

if(x >= -EPSINON && x<= EPSINON)


第11題

以下為Windows NT下的32位C++程序,請計(jì)算sizeof的值


void Func ( char str[100] )

{

sizeof( str ) = ?

}

void *p = malloc( 100 );

sizeof ( p ) = ?

sizeof( str ) = 4

sizeof ( p ) = 4

【剖析】

Func ( char str[100] )函數(shù)中數(shù)組名作為函數(shù)形參時(shí),在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,僅僅只是一個指針;在失去其內(nèi)涵的同時(shí),它還失去了其常量特性,可以作自增、自減等操作,可以被修改。

數(shù)組名的本質(zhì)如下:

(1)數(shù)組名指代一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)就是數(shù)組;

例如:


char str[10];

cout << sizeof(str) << endl;

輸出結(jié)果為10,str指代數(shù)據(jù)結(jié)構(gòu)char[10]。

(2)數(shù)組名可以轉(zhuǎn)換為指向其指代實(shí)體的指針,而且是一個指針常量,不能作自增、自減等操作,不能被修改;

char str[10];

str++; //編譯出錯,提示str不是左值

(3)數(shù)組名作為函數(shù)形參時(shí),淪為普通指針。

Windows NT 32位平臺下,指針的長度(占用內(nèi)存的大?。?字節(jié),故sizeof( str ) 、sizeof ( p ) 都為4。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ^函數(shù)重載的匹配: 當(dāng)函數(shù)名被重載后,函數(shù)的匹配過程:首先尋找能精確匹配的函數(shù),如果未能精確匹配,則嘗試...
    魯大帥閱讀 1,142評論 0 1
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,572評論 0 35
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,249評論 0 7
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,594評論 0 6
  • http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741...
    RavenX閱讀 634評論 0 1

友情鏈接更多精彩內(nèi)容