今天調試程序的時候,發現一個奇怪的問題,之前調試都沒問題的,今早加了一點東西,就出現錯誤,跳到調試位置,如下4行紅色部分
1 ; Find next lower page and probe 2 cs20: 3 sub eax, _PAGESIZE_ ; decrease by PAGESIZE 4 test dword ptr [eax],eax ; probe page. 5 jmp short cs10 6 7 _chkstk endp 8 9 end
感覺好奇怪,然后斷點調試,連程序的入口都沒進就出現了這個錯誤,好郁悶。
然后百度一下,原來是因為局部變量申請的空間過大,大於了1M。
局部變量的申請空間是存放於棧中,windows里默認棧內存是1M,所以當申請空間大於1M時就會出現溢出錯誤。
查看了一下源代碼,原來今天早上增加了一個結構體數組,數組超出堆棧的大小了。
在類中有如下定義:
//色亮度數據 struct LXY { float L; //亮度 float x; //色度x float y; //色度y }; LXY LxyData[HIGHTH][WIDTH]; //整個畫面數據
另外
1 #define WIDTH 640 //像素寬度 2 #define HIGHTH 480 //像素高度
這樣下來這個數組所占的空間為 640*480*(4+4+4)= 3686400B = 3600KB = 3.515625M
對於這種情況,解決辦法就是修改數組的定義,換成動態數組
1 CArray<LXY,&LXY> LxyData;
要么就是擴大棧空間的大小。
擴大空間堆棧大小的方法是
Project->Properties->Configuarations Properties->Linker->System->Stact Reserve Size
例如修改成5M,可以輸入5242880
1024*1024*5 = 5242880
這樣修改后程序就可以正常運行了。
倆兒子