两个吃奶一个添下面视频_人妻第一页香蕉网_欧美xxxx少妇_妺妺窝人体色www婷婷

  • 歡迎訪問C語言網(wǎng)www.sztianhecheng.cn 比賽欄每月有獎(jiǎng)月賽!舉辦比賽聯(lián)系QQ:2045302297
  • 問題反饋、粉絲交流 QQ群327452739 藍(lán)橋杯訓(xùn)練群:113766799 申請(qǐng)群時(shí)請(qǐng)備注排名里的昵稱
  • C語言研究中心 為您提供有圖、有料、解渴的C語言專題! 歡迎討論!

數(shù)組越界為什么沒有出錯(cuò)?

C語言研究中心 CTO 19612次瀏覽 7個(gè)評(píng)論

請(qǐng)先看一到程序:

數(shù)組越界為什么沒有出錯(cuò)?

程序試圖給長(zhǎng)度為10的字符串str拷貝超過10個(gè)長(zhǎng)度的字符串,不少初學(xué)者可能忘記了數(shù)組開辟的長(zhǎng)度或是沒有意識(shí)到越界的問題引發(fā)這樣的錯(cuò)誤寫法,可能更令新人詫異的是,這樣的寫的程序竟然編譯器不報(bào)錯(cuò),并且運(yùn)行也不報(bào)錯(cuò)! 大家可以自行嘗試運(yùn)行這個(gè)程序,不僅編譯沒有問題,運(yùn)行也看起來一切“正常”!

數(shù)組越界為什么沒有出錯(cuò)?

這就是一個(gè)典型的數(shù)組越界引發(fā)的問題,如果大家細(xì)心讀程序觀察結(jié)果,就會(huì)發(fā)現(xiàn)雖然str字符串的內(nèi)容沒有問題,但旁邊的整形變量a似乎有點(diǎn)“搶鏡”哦,原來是5,可現(xiàn)在竟然輸出0! 再看看代碼,又沒有被賦值,就莫名由5改成了0!真是躺著也中槍?。?/span>

那這里為什么a的值被更改了呢?下面我們?yōu)榇蠹以敿?xì)解釋!

 

若要查明這個(gè)原因,大家可以跟蹤內(nèi)存,尤其變量a的位置便可以查明一二。

如圖,Strcpy函數(shù)前下斷點(diǎn),首先確認(rèn)a的值和str的初始值:

數(shù)組越界為什么沒有出錯(cuò)?

a確認(rèn)是5沒有問題,由于str數(shù)組的地址我們觀察到比a要小,所以內(nèi)存監(jiān)視這里我們更新為str的地址,可以順便觀察str和它后面的a兩個(gè)值,如下圖:

數(shù)組越界為什么沒有出錯(cuò)?

可以看到str地址0x0019ff30處還未初始化,而a的地址為0x0019ff3c且初始化為5,沒有問題!

執(zhí)行下一步繼續(xù)觀察:

數(shù)組越界為什么沒有出錯(cuò)?

看到str數(shù)組已經(jīng)被初始化為0(紅色部分占10個(gè)字節(jié)),注意此時(shí)的a距離str最后一個(gè)元素也就是str[9]的位置也就三個(gè)字節(jié)! 現(xiàn)在大家可以偷偷再數(shù)一數(shù)strcpy給str拷貝的字符串長(zhǎng)度為12個(gè)…咳咳

 

那么繼續(xù)下一步,繼續(xù)觀察:

數(shù)組越界為什么沒有出錯(cuò)?

注意,問題來了! Strcpy這一步直接導(dǎo)致從0x0019ff30處開始的13個(gè)字節(jié)全部更改,并且波及到了a的地址0x0019ff3c處,仔細(xì)觀察分析內(nèi)容可以看到前12個(gè)分別為123456789123這12個(gè)數(shù)的ASC碼,而第13個(gè)字節(jié)的內(nèi)容則為字符串結(jié)尾的’\0’所致!使得第13個(gè)字節(jié)處的內(nèi)容也就是a的地址也被字符串末尾的\0進(jìn)行覆蓋,所以原來的5被0覆蓋!這就是a躺著也中槍的真實(shí)原因! 超長(zhǎng)的字符串加上結(jié)尾的\0使得下一個(gè)變量的值也受到了影響!

 

這就是數(shù)組越界引發(fā)的問題的實(shí)驗(yàn),希望對(duì)大家有幫助!

有問題歡迎指出!

 

C語言研究中心(www.sztianhecheng.cn)

 

 

C語言網(wǎng)提供「C語言、C++、算法競(jìng)賽」在線課程,全部由資深研發(fā)工程師或ACM金牌大佬親授課,更科學(xué)、全面的課程體系,以在線視頻+在線評(píng)測(cè)的學(xué)習(xí)模式學(xué)習(xí),學(xué)練同步,拒絕理論派,真正學(xué)會(huì)編程!還有獎(jiǎng)學(xué)金等增值福利等你!

C語言網(wǎng), 版權(quán)所有丨如未注明 , 均為原創(chuàng)丨本網(wǎng)站采用BY-NC-SA協(xié)議進(jìn)行授權(quán) , 轉(zhuǎn)載請(qǐng)注明數(shù)組越界為什么沒有出錯(cuò)?!
喜歡 (79)
[jinyangH@aliyun.com]
分享 (0)
發(fā)表我的評(píng)論
取消評(píng)論
表情

Hi,您需要填寫昵稱和郵箱!

  • 昵稱 (必填)
  • 郵箱 (必填)
(7)個(gè)小伙伴在吐槽
  1. 看起來不錯(cuò)
    嶺上百合2016-12-24 23:36 回復(fù)
  2. 有意思!喜歡
    干凈的小學(xué)生2017-04-27 10:30 回復(fù)
  3. #include int main(void) { int i=5; int a[5]; for(i=0;i<=5;i++) { a[i]=0; printf("%d\n",a[i]); } return 0; } 情況類似?
    海洋之心2017-07-27 09:36 回復(fù)
    • 用i-1代替循環(huán)里的i啊,就不會(huì)錯(cuò)了
      cool2017-10-09 12:37 回復(fù)
  4. 為什么先定義的a,但是地址分配時(shí)先給了str地址?難道地址的分配順序和定義順序無關(guān)?!
    cool2017-10-09 12:38 回復(fù)
    • 因?yàn)檩敵龅臅r(shí)候是先輸出str的值,然后再輸出a的值
      夢(mèng)雨2018-12-21 10:40 回復(fù)
  5. 好捏
    lemon2022-10-04 18:16 回復(fù)