讀字串越界

2021-06-18 06:40:35 字數 991 閱讀 3454

寫c程式的時候經常會用到讀字串。當為字串陣列開闢的空間不夠大的時候,輸入字元數大於陣列大小會發生不可預知的執行時的錯誤,這種錯包括

1> 執行時錯誤,2>結果錯誤,3,>段錯誤。

遺憾的是c語言本身沒有提供檢測這種的錯誤的機制。下面根據**分析產生錯誤的型別以及原因。

分析1

#include int main(void)

return 0;

}

若輸入1234567,輸出為1234567;

上面**,若輸入12345678會輸出123456740。

為什麼會出現123456740

,而不是輸出12345678呢?如果了解函式棧結構我們會指導 i 的位址就是input[8]的位址。當迴圈進行八次之後i=8,input[8]=0x08;經過這樣的運算12345678*10+8-48,得到1234456740。當然得到這個值也取決於機器的位元組存放順序,是大端法還是小短髮,得出這樣的結果也證明本機是採用的是大端法。若是小端法會得到另外一種結果。

分析2

#include int main(void)

sum = sum*10 + input[i] - '0';

} printf("input=%d\n", sum);

} return 0;

}

執行./main

輸入12345678

輸出invalid input!

解釋見分析一。不會產生段錯誤。

分析3

若把分析2**中while迴圈去掉,再輸入12345678901234567,17個數字會超過main函式中sum的位址的範圍,會發生段錯誤。

但是在**2中輸入這17個數字則不會產生段錯誤?這是為什麼呢?這是因為如果某個函式的區域性變數發生訪問越界,有可能並不立即發生段錯誤,而是在函式返回的時候發生段錯誤。

****  

從字串越界看棧分配

code int x 35 char str 10 strcpy str,www.it315.org 共13個字母 問此時x的值是多少 在vc6.0裡值 x 103 大部分人都知道這是陣列越界了,但為什麼x是103呢?棧的分配是從高低址到低位址,vc裡棧記憶體對齊為變數分配的空間大小一般以4 byt...

python字串下標越界 Python 字串

str1 abcdef 字串 str型 int1 1 整數 int型 float1 1.3 浮點數,float型 str2 abcdef 單引號和雙引號都可以表示字串 print str1,str2 在某一行按下ctrl 就可以進行注釋,注釋就是程式不執行該行 注釋是給人看的,而不是給程式看的 pr...

字串初始化與陣列越界問題。

string p1 abcd char p2 abcd char p3 abcd sizeof p3 5 字串結尾都有系統自動補 0 可用作判斷字串結束標誌 字元陣列和字串最明顯的區別就是字串會被預設的加上結束符 0 char p4 4 abcd 在定義時 系統提示字元太長編譯不通過。abcd 長度...