char str[16];
sprintf(str, "%s%s%s%s","ABCD","EFGH","IJKL","MNOP");
printf("str=%s",str);
為啥列印結果是 str=ABCDEFGHIJKLMNOP
sprintf會在最后自動補\0,4個字串已經占了16位元組了。我理解是不是實際sprintf針對寫str記憶體的時候沒有考慮目的快取長度,這么做實際記憶體已經溢位,寫了17位元組,在溢位的第17位元組自動補了\0,只是當前正好第17位元組沒有人用,如果后面有對第17位元組的其他操作那就會導致printf出現不可預知的情況了
uj5u.com熱心網友回復:
你對不可預知的理解有問題不可預知是 無法確定有沒有問題
不是保證會有問題
uj5u.com熱心網友回復:
為什么要有問題(O_O)?uj5u.com熱心網友回復:
陣列越界是未定義行為,因此可能成功,可能失敗。建議用snprintf
uj5u.com熱心網友回復:

VS2015除錯,是越界添加了'\0',最終能輸出,但是程式再輸出后會報錯。
uj5u.com熱心網友回復:
sprintf影響了第17個位元組,但對于下一行的printf來講沒有任何的影響,因為printf函式對于記憶體是讀的操作,但由于你的sprintf越界訪問,1、就像你說的,第17年位元組被其它變數使用的話,會導致其它變數的值不確定。2、如果第17位元組是系統所使用的,作業系統的保護功能可能會中止程式的運行,也有可能直接讓系統崩潰,在win98是測驗過類似的情況,當字越界的很厲害,就死機了。3、這種越界如果精心構造,利用作業系統的漏洞獲取目標計算機的shell,讓其它執行某個程式。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88685.html
標籤:C語言
上一篇:越改越懵,求大佬,謝謝
