3 回答

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

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