寫c程式的時候經常會用到讀字串。當為字串陣列開闢的空間不夠大的時候,輸入字元數大於陣列大小會發生不可預知的執行時的錯誤,這種錯包括
1> 執行時錯誤,2>結果錯誤,3,>段錯誤。
遺憾的是c語言本身沒有提供檢測這種的錯誤的機制。下面根據**分析產生錯誤的型別以及原因。
分析1
#include int main(void)若輸入1234567,輸出為1234567;return 0;
}
上面**,若輸入12345678會輸出123456740。
為什麼會出現123456740
,而不是輸出12345678呢?如果了解函式棧結構我們會指導 i 的位址就是input[8]的位址。當迴圈進行八次之後i=8,input[8]=0x08;經過這樣的運算12345678*10+8-48,得到1234456740。當然得到這個值也取決於機器的位元組存放順序,是大端法還是小短髮,得出這樣的結果也證明本機是採用的是大端法。若是小端法會得到另外一種結果。
分析2
#include int main(void)執行./mainsum = sum*10 + input[i] - '0';
} printf("input=%d\n", sum);
} return 0;
}
輸入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 長度...