從字串越界看棧分配

2021-05-25 18:16:03 字數 946 閱讀 5018

code:

int x=35;   

char str[10];   

strcpy(str,"www.it315.org"

/*共13個字母*/);   

/*問此時x的值是多少*/

在vc6.0裡值 x=103;

大部分人都知道這是陣列越界了,但為什麼x是103呢?

棧的分配是從高低址到低位址,vc裡棧記憶體對齊為變數分配的空間大小一般以4 byte遞增,特殊情況除外。

所以程式未執行第三句前,記憶體狀態是這樣的。

一般pc機的cpu是little-endian

模式,little-endian

模式的cpu對運算元的存放方式是從低位元組到高位元組。乙個測試你電腦cpu是little-endian模式還是big-endian

模式(對運算元的存放方式是從高位元組到低位元組)的程式,具體實現如下:

code:

#include 

using

namespace std;   

int checkcpu()   

c;   

c.a = 1;   

return (c.b == 1);   

}   

int main()   

聯合體union的存放順序是所有成員都從低位址開始存放,所以通過這個方法可以測出cpu的模式。

當程式執行完strcpy(str,"www.it315.org"

/*共13個字母*/

); 這行後,記憶體狀態變為:

cpu對字元的存放放式是從低位元組到高位元組,而本例的執行環境cpu對數值的存放方式是little-endian

模式(即也是從低位元組到到位元組)。所以從記憶體0012ff20處數值部分(x=35,35的二進位制表示小於乙個位元組)被字元部分完整覆蓋,而覆蓋的字元g的ascii值是103,所以x的數值表示就成103。

讀字串越界

寫c程式的時候經常會用到讀字串。當為字串陣列開闢的空間不夠大的時候,輸入字元數大於陣列大小會發生不可預知的執行時的錯誤,這種錯包括 1 執行時錯誤,2 結果錯誤,3,段錯誤。遺憾的是c語言本身沒有提供檢測這種的錯誤的機制。下面根據 分析產生錯誤的型別以及原因。分析1 include int main...

從字串常量起說記憶體分配

char p char p char p new char include using namespace std const int n 20 int main cout1.char p hello world correct 定義的是乙個字串陣列,裡面存的內容是hello world 0,可以對...

python字串下標越界 Python 字串

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