哈嘍啊大家晚上好!
今天呢給大家帶來一個燒腦的知識——C語言中的棧溢出問題。那什么是棧溢出呢?棧溢出指的是當程序在執行函數調用時,為了保護函數的局部變量和返回地址,將這些數據存儲在棧中。如果函數在函數調用時使用了過多的棧空間(比如遞歸調用函數時),棧空間可能會被耗盡,從而導致數據溢出到相鄰的內存區域。
下面我給大家舉一個例子方便大家更直觀的認識棧溢出,比如:
在VS2022、X86、Debug 的環境下,編譯器不做任何優化的話,下?代碼執?的結果是啥?
#include <stdio.h>
int main()
{int i = 0;int arr[10] = {0};for(i=0; i<=12; i++){arr[i] = 0;printf("hehe\n");}return 0;
}
相信大多數人肯定會認為結果是打印出 10個"hehe",但是結果并不止這樣,而是程序死循環了
那為何為這樣呢?這就要牽扯到C語言中數據的存放問題了,下面我給大家放一張圖相信大家就理解了?
在這張圖中, 棧區內存的使?習慣是從?地址向 低地址使?的,所以變量i的地址是 較?的。arr數組的地址整體是? 于i的地址。
?數組在內存中的存放是:隨著下標 的增?,地址是由低到?變化的。 所以根據代碼,就能理解為什么是左 邊的代碼布局了。 如果是左邊的內存布局,那隨著數組 下標的增?,往后越界就有可能覆蓋 到i,這樣就可能造成死循環的。
這?肯定有人有疑問:為什么i和arr 數組之間恰好空出來2個整型的空間 呢?這?確實是巧合,在不同的編譯 器下可能中間的空出的空間??是不 ?樣的,代碼中這些變量內存的分配 和地址分配是編譯器指定的,所以的 不同的編譯器之間就有差異了。所以 這個題?是和環境相關的。
那么到這里相信大家就理解了C語言中的棧溢出問題了,那今天的知識分享就到此結束啦,感謝大家支持,各位明天見!?