棧記憶體問題排查:
編譯時增加-g 和安全編譯選項-fstack-protector
-g:生成除錯資訊,用於後續gdb除錯;
-fstack-protector:在編譯時會在函式棧框中插入乙個canary,並實現了通過這個canary來檢測函式棧是否被破壞;如果程式執行過程**現越界執行到canary隨機數,程式會立馬結束;
makefile如下:
target = stack_1
$(target):stack_1.c
#gcc -g $^ -o $@ -lpthread
#gcc -wall -o2 -g $^ -o $@ -lpthread
gcc -fstack-protector -wall -o2 -g $^ -o $@ -lpthread
clean:
rm -rf $(target)
stack_over.c 如下:
#include #include #include #if 0
/*棧越界,編譯時使用-fstack-protector,程式執行時遇到越界會立馬結束*/
void test_func(int a)
; strcpy(p,"1234567890abcdef");
printf("p:%s\n",p); }
#else
/*棧溢位,通過lr指標確認*/
void test_func(int a)
; strcpy(p,"1234567890abcdef");
printf("p:%s\n",p); }
#endif
void *thread_test_stack(void *param)
int main(void)
編碼建議:
1.不要申請大的區域性變數
2.開闢合適大小的執行緒棧空間
3.函式入參盡量指標傳遞
棧記憶體指標的問題
這幾天在學習c過程中,在使用指標作為函式引數傳遞的時候出現了問題,根本不知道從何得解 源 如下 createnode binnode tree,char p 該 段的意圖是通過乙個函式建立乙個二叉樹的節點,然而在,呼叫該函式後,試圖訪問該節點結構體的成員時候,卻發生了記憶體訪問錯誤,到底問題出在哪兒...
堆記憶體 棧記憶體
從堆和棧的功能和作用來通俗的比較,堆主要用來存放物件的,棧主要是用來執行程式的.而這種不同又主要是由於堆和棧的特點決定的 在程式設計中,例如c c 中,所有的方法呼叫都是通過棧來進行的,所有的區域性變數,形式引數都是從棧中分配記憶體空間的。實際上也不是什麼分配,只是從棧頂向上用就行,就好像工廠中的傳...
堆和棧記憶體擴充套件方向問題
棧 在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意 思是棧頂的位址和棧的最大容量是系統預先規定好的,在windows下,棧的大小是2m 也有 的說是1m,總之是乙個編譯時就確定的常數 如果申請的空間超過棧的剩餘空間時,將 提示overflow。因此,能從棧獲...