棧記憶體問題

2021-09-29 20:25:02 字數 983 閱讀 9917

棧記憶體問題排查: 

編譯時增加-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。因此,能從棧獲...