第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么chac的結(jié)果是Hellohello而不是Hello

為什么chac的結(jié)果是Hellohello而不是Hello

C
Andrew111 2016-10-06 19:01:45
int?main() { char?sz[]?=?"hello"; puts(sz); char?chac[]={'H','e','l','l','o'}; puts(chac); return?0; }
查看完整描述

3 回答

已采納
?
onemoo

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é)束了打?。?。 但這絕對是錯誤的做法,一定要避免寫這樣的代碼!

查看完整回答
2 反對 回復(fù) 2016-10-06
?
皓韻兒

TA貢獻(xiàn)86條經(jīng)驗 獲得超114個贊

http://img1.sycdn.imooc.com//57f6478100016bf701220086.jpg是這樣的吧,因為你在前面還輸出了一個 ?puts(sz) ; 這個輸出的是第一個 hello ? 然后在后面你又 puts(chac); ?輸出的是 Hello. 后面的那個, 望采納 ,謝謝。

查看完整回答
1 反對 回復(fù) 2016-10-06
  • 3 回答
  • 0 關(guān)注
  • 1835 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號