切忌,不要輕易使用指向棧的指標

2021-08-25 01:51:14 字數 635 閱讀 8687

程式

include

void f1( int *& j)

void any_function_use_local_variables()

int main()

{int i=10;

int *j=&i;

f1(j);

cout<<*j<┃ j ┃

┣━━━━━┫ ┗━━┛

┃ 中斷入口 ┃

┣━━━━━┫

┃ ┃由於傳入的是j的引用,函式返回後j仍指向棧中l的空間。而函式返回時並沒有修改棧中各個單元的值,只是將指標指向中斷入口前,因此這時*j的值為20。

當呼叫any_function_use_local_variables()時,原來l的空間將被b的值覆蓋,所以返回時再次輸出*j的值時就變成100了,棧如下:

┃ ┃┣━━━━━┫

┃ c=100 ┃

┣━━━━━┫

┃ b=100 ┃<---j

┣━━━━━┫

┃ a=100 ┃

┣━━━━━┫

┃ 中斷入口 ┃

┣━━━━━┫

┃ ┃棧中的內容很容易隨著函式的呼叫而發生改變,通過這個例子可以得出,在使用指標時,不要輕易將指標指向棧中的空間,除非你有十成的把握。

不要輕易使用TerminateThread中止執行緒

聽過無數次不要terminatethread,只是工作中常用,貌似也沒有什麼問題。今天在高強度測試中發現了乙個不可原諒的錯誤。參看下面的例子 dword stdcall mythread void int tmain int argc,tchar argv 為什麼死鎖呢?new操作符用的是小塊堆,整...

return不能返回指向棧記憶體的指標

棧是臨時的 當跳出棧時,其指標對應的值被下次壓棧替換掉 可能每次出棧時,系統可能會對剛才壓棧的記憶體初始化 include uisng namespace std char getstring int main 此程式中,return返回的是指向棧記憶體的位址,程式編譯警告,因為給該內存在函式結束時...

不要傷害指標(2) 指標的型別和指標所指向的型別

在談論指標之前,永遠記住指標的四要素 指標的型別,指標所指向的型別,指標指向的記憶體區,指標自身佔據的記憶體。指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據...