3 回答

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

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