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

字符串問(wèn)題

字符串

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


char* str1 = "0123456789";

char string[10];

在第一種定義中痹升,雖然只有10個(gè)字符叨橱,但是使用了11個(gè)字節(jié)來(lái)保存典蜕。最后一個(gè)字節(jié)為`\0`

當(dāng)進(jìn)行strcpy的時(shí)候,strcpy(string,str1) 這樣就會(huì)導(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 );

}

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


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

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

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)

{

//對(duì)源地址和目的地址加非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;

}


第五題

檢查下面代碼有什么問(wèn)題


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ù)值。在取得地址后并沒(méi)有返回脱茉,所以str指針仍然是NULL剪芥。


第六題

下面代碼會(huì)出什么問(wèn)題


char *GetMemory( void )

{

char p[] = "hello world";

return p;

}

void Test( void )

{

char *str = NULL;

str = GetMemory();

printf( str );

}

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


第七題

下面代碼會(huì)出什么問(wèn)題


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í)行申請(qǐng)內(nèi)存及賦值語(yǔ)句*p = (char *)malloc(num);后沒(méi)有判斷內(nèi)存是否申請(qǐng)成功,應(yīng)加上:

if ( *p == NULL )

{

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

}

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

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


第八題

下面代碼會(huì)出什么問(wèn)題


void Test( void )

{

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

strcpy( str, "hello" );

free( str );

... //省略的其它語(yǔ)句

}

沒(méi)有進(jìn)行判斷內(nèi)存是否申請(qǐng)成功净捅;

在free(str)后沒(méi)有把str置為空,可能會(huì)成為一個(gè)野指針辩块。應(yīng)當(dāng)加上str=NULL蛔六;


第九題

下面代碼會(huì)出什么問(wèn)題


swap( int* p1,int* p2 )

{

int *p;

*p = *p1;

*p1 = *p2;

*p2 = *p;

}

需要返回值

p是一個(gè)野指針,有可能指向系統(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++程序国章,請(qǐng)計(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)涵液兽,僅僅只是一個(gè)指針;在失去其內(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í)體的指針凭迹,而且是一個(gè)指針常量罚屋,不能作自增、自減等操作嗅绸,不能被修改脾猛;

char str[10];

str++; //編譯出錯(cuò),提示str不是左值

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

Windows NT 32位平臺(tái)下羹铅,指針的長(zhǎng)度(占用內(nèi)存的大小)為4字節(jié)愉昆,故sizeof( str ) 职员、sizeof ( p ) 都為4。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跛溉,一起剝皮案震驚了整個(gè)濱河市焊切,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芳室,老刑警劉巖专肪,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異堪侯,居然都是意外死亡嚎尤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)伍宦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芽死,“玉大人,你說(shuō)我怎么就攤上這事次洼」毓螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵滓玖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我质蕉,道長(zhǎng)势篡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任模暗,我火速辦了婚禮禁悠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兑宇。我一直安慰自己碍侦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布隶糕。 她就那樣靜靜地躺著瓷产,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枚驻。 梳的紋絲不亂的頭發(fā)上濒旦,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音再登,去河邊找鬼尔邓。 笑死晾剖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梯嗽。 我是一名探鬼主播齿尽,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼灯节!你這毒婦竟也來(lái)了循头?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤显晶,失蹤者是張志新(化名)和其女友劉穎贷岸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體磷雇,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偿警,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唯笙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟蒸。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖崩掘,靈堂內(nèi)的尸體忽然破棺而出七嫌,到底是詐尸還是另有隱情,我是刑警寧澤苞慢,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布诵原,位于F島的核電站,受9級(jí)特大地震影響挽放,放射性物質(zhì)發(fā)生泄漏绍赛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一辑畦、第九天 我趴在偏房一處隱蔽的房頂上張望吗蚌。 院中可真熱鬧,春花似錦纯出、人聲如沸蚯妇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)箩言。三九已至,卻和暖如春焕襟,著一層夾襖步出監(jiān)牢的瞬間分扎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工胧洒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畏吓,地道東北人墨状。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像菲饼,于是被迫代替她去往敵國(guó)和親肾砂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

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