關於這一點本來是不想寫的,一直覺的是些旁枝末葉的東西,很容易就能掌握,或者說不會犯錯的地方,但這兩天敲**的時候就遇到了這樣的問題,或者說不容易犯錯的地方才最容易犯錯吧!下面切入正題:
何為野指標,對乙個指向空位址的指標我們將其稱為野指標,即所指向的位址不能進行操作的指標;(這兩天寫c++的時候就遇到了這個問題,我把指標重新指向了未分配的空間並對其進行了操作!剛開始硬是不知道自己錯在哪!來來回回的看來好幾遍才想到這一點);
下面先來看一段**;
1#define _crt_secure_no_warnings
2 #include 3 #include
4 #include 5
6void distribution(char **str)//
分配空間715
16 tmp = (char *)malloc(sizeof(char)* 5
);17
if(tmp ==null)
1822 strcpy(tmp,"
aaa");//
將aaa字串copy到分配的記憶體空間中
23 *str = tmp;//
可以通過二級指標來操作一級指標的指向
//即間接賦值是指標存在的最大意義
2425
/*******************************
*/26
//然後我們將透tmp所指向的記憶體空間釋放掉
27free(tmp);
28/*
******************************
*/29}30
31void
main()
3242
43if(point !=null)
4447
4849 system("
pause");
50return
;51 }
在這裡我們可以看到,在distribution()函式中雖然我們已經在棧區分配了記憶體,並將指標指向了它,但是當我們將其釋放掉之後,並不能判斷出它已經是空指標了,而且會列印出一堆亂碼,並且再次對這塊記憶體進行釋放的時候 free(point) 我們會發現編譯器會直接報錯(老版本的編譯器搞不好會直接當機);
所謂的位址就是記憶體編號,而這個記憶體編號也就是我們所說的實體地址,我們所能析構的和操作的記憶體空間,也就是我們對其進行了型別(int ,char等)宣告的記憶體空間,不然是無法對其訪問的,所以也就是說釋放的記憶體空間就是將我們所宣告的位址型別給抹除了,它就變為了沒有型別,沒有型別不是void型別,但是實體地址是無法被釋放的,不然我們要到**去操作記憶體空間呢?所以即使釋放掉了記憶體空間,位址仍然存在,所以身為乙個負責任的人我們應該在釋放完記憶體之後,將其指向null(這也是為什麼很多資料上在要求定義變數的時候就初始化的原因吧!);
**str = &point;// * 就像一把鑰匙,通過*str可以達到改變point指向的效果,**str可以達到改變*point(改變具體值)的效果;
free(tmp); tmp = null;通過free(tmp),直接釋放掉了在在堆區所分配的記憶體,但是指向這個記憶體塊的的位址符是不會改變的,即在tmp在沒有指向null的時候*str所指向的位址符和tmp時一樣的,所以釋放的tmp所指向的記憶體塊,即釋放了*str所指向的記憶體塊,但是*str的記憶體快並沒有改變,所以此時應該在加上*str = null,這樣point也會指向null,而不會指向乙個只有位址符的記憶體塊(即野指標);
在進行記憶體分配的時候我們也要知道我們是不是用null指向了乙個位址,即
distribution(null);//如果我們傳遞乙個空位址過去,而且沒有合理的處理,編譯器會直接報錯如果不對其判斷直接執行
//if(str == null)//如果傳遞過來的位址為空,則不執行以下操作
*str = tmp;//可以通過二級指標來操作一級指標的指向//即間接賦值是指標存在的最大意義編譯器會直接報錯,因為無法使用null指向乙個位址;
野指標問題
最近在看之前的 對之前的bug有些新的認識,這裡總結下,學疏才淺,跟大家分享下吧。首先是用到了乙個傳送函式 static int send fun uint16 t length,uint8 t data 需要根據不同的條件判斷傳送的資料 data 以下實現是錯誤的 int judge send f...
野指標相關問題
最近在學習並行程式設計時注意到了uaf use after free 問題,引發uaf問題的原因一般是因為在釋放了某個指標指向的記憶體後,並沒有將該指標置空,從而可以通過該指標非法地修改記憶體。以前因為一直都沒有寫過大型專案,也不曾特別關心安全問題,雖然知道在指標申請後手動置為null但一度以為在f...
演算法筆記 野指標問題
野指標 乙個指標在free之後沒有被賦值成null。造成野指標的原因 在函式free p 中只是將p指標的值傳遞給了函式,僅僅是釋放了形參的值,實參的值並沒有改變,並且malloc函式在作業系統分配的時候是順序分配 比如釋放了的p原本使用的位址為2000,那麼下一次malloc分配的位址就是這個20...