3 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
C語言中規(guī)定:字符串是一串連續(xù)存放的char,并且以'\0'結(jié)尾。
C語言中并沒有字符串類型,為了滿足C對(duì)字符串的定義,我們一般以char數(shù)組的形式來表示字符串,因?yàn)閿?shù)組滿足連續(xù)存放這一要求,但要注意:一定要以'\0'結(jié)尾。
一般代碼中這樣寫:
char?str[]?=?"Hello";
這里用一個(gè)字符串字面量來初始化char數(shù)組str,字符串字面量是以'\0'結(jié)尾的,就是說"Hello"其實(shí)包含H e l l o這5個(gè)字符和結(jié)尾的'\0'一共6個(gè)字符。 這樣str數(shù)組是含有6個(gè)char的數(shù)組,其中的字符分別是 H e l l o '\0',滿足C語言對(duì)字符串的規(guī)定。
所以你定義sz是正確的。
那么如果你以初始化列表的形式初始化這樣一個(gè)數(shù)組,就要注意顯式加上結(jié)尾的'\0':
char?str[]?=?{'H',?'e',?'l',?'l',?'o',?'\0'};
否則,這只是一個(gè)char數(shù)組,并不滿足字符串的規(guī)定。 所以你定義chac字符串的方式是錯(cuò)誤的。
要說明一下:str是個(gè)char數(shù)組這沒有錯(cuò),只不過無法把它當(dāng)作字符串。
C語言標(biāo)準(zhǔn)函數(shù)庫中要求參數(shù)是字符串的函數(shù),都要求該參數(shù)滿足字符串的規(guī)定,最重要的就是一定要以'\0'結(jié)尾。實(shí)際上,這些函數(shù)大概是這樣工作的:從這個(gè)字符串的第一個(gè)字符開始處理,直到處理到'\0'為止。
你問的puts(chac)會(huì)打印出Hellohello 就是因?yàn)閏hac缺少了結(jié)尾的'\0': puts打印chac中的內(nèi)容,打印完H e l l o后并沒有遇到'\0',于是就繼續(xù)打印后面內(nèi)存中的內(nèi)容。這就是緩沖區(qū)溢出漏洞,這是嚴(yán)重的安全隱患!? 后面內(nèi)存中有什么完全是無法確定的,有可能訪問到不該訪問的內(nèi)容。 你這個(gè)例子中能繼續(xù)打印出hello大概是因?yàn)閏hac后面的內(nèi)存中正好是sz的內(nèi)容(sz是以'\0'結(jié)尾的,所以結(jié)束了打印)。 但這絕對(duì)是錯(cuò)誤的做法,一定要避免寫這樣的代碼!

TA貢獻(xiàn)86條經(jīng)驗(yàn) 獲得超114個(gè)贊
是這樣的吧,因?yàn)槟阍谇懊孢€輸出了一個(gè) ?puts(sz) ; 這個(gè)輸出的是第一個(gè) hello ? 然后在后面你又 puts(chac); ?輸出的是 Hello. 后面的那個(gè), 望采納 ,謝謝。
- 3 回答
- 0 關(guān)注
- 1845 瀏覽
添加回答
舉報(bào)