如果乙個指標指向的記憶體沒有訪問許可權,或者指向一塊已經釋放掉的記憶體,那麼就無法對該指標進行操作,這樣的指標稱為野指標(wild pointer)。
請看下面的**:
#include int main()
在gcc下執行,輸入乙個字串後會提示段錯誤(segment fault)。在vs下執行,輸入乙個字串後會提示類似下面的錯誤:
這是因為,str 是區域性變數,它的值是不確定的,是隨機的,不知道指向哪塊記憶體。一般情況下,這塊記憶體要麼沒有訪問許可權,要麼還沒有分配,當 gets() 函式試圖將讀取到的字串寫入這塊記憶體時,必然會發生錯誤。
當然,如果足夠幸運的話,str 也可能恰好指向一段分配好的、並且有讀寫許可權的記憶體,程式就執行成功了,但這是小概率事件,一般不會發生。
請繼續看下面的**:
#include #include #include int main()
return 0;
}
執行程式,第一次輸出c語言中文網,第二次輸出的是亂碼或者什麼也不輸出。這是因為,freed() 只是釋放掉了動態分配的記憶體,但並未改變 str 的值,str 的值不是 null,它仍然指向被釋放掉的記憶體,所以會執行 if 語句裡面的 puts() 函式。但由於此時的記憶體已經被釋放掉了,原來的字串已經不在了,所以輸出的資料是未知的。
這就提醒我們,使用 free() 釋放記憶體的同時要將指標置為null,否則下次就無法判斷指向的記憶體是否有效。
請看下面的**:
#include void func(char **pp);
int main()
void func(char **pp)
arr 陣列在棧上分配記憶體,字串"c語言中文網"就儲存在這裡,func() 函式執行結束後,這塊記憶體被釋放掉,但是函式外部的 pstr 仍然指向這裡,所以執行puts(pstr);時,輸出結果是未知的。
如下**:
char *p = malloc(100*sizeof(char));
char *q = malloc(100*sizeof(char));
q=p;//此時q指向了p的記憶體
free(p);
/*此時釋放的是p所指向的記憶體,此時,就會導致p指向了一塊已釋放的記憶體,這是乙個人為的無心之錯,必須注意*/
要想規避野指標,就要養成良好的程式設計習慣:
指標變數如果暫時不需要賦值,一定要初始化為null,因為任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的。
當指標指向的記憶體被釋放掉時,要將指標的值設定為 null,因為 free() 只是釋放掉了記憶體,並為改變指標的值。
c 野指標(迷途指標)的理解
date 2018.12.16 直接上程式 include using namespace std int main int pint new int pint 10 cout pint迷途指標也叫懸浮指標,失控指標,是對乙個指標delete後 這樣會釋放它所指向的記憶體 並沒有把它設定為空時產生的...
談談對野指標的理解
野指標說白了就是指向不明確或者指向沒有意義的指標,野指標的產生歸咎於以下3種情況。首先說一下空指標 null pointer 空指標不指向任何物件或者函式,反過來說任何物件或者函式的位址都不能是空指標。空指標如何建立?int pt null 空指標null和記憶體首位址0x0的區別?空指標不指向任何...
什麼是野指標?野指標的危害?如何避免野指標?
什麼是野指標?野指標是指隨機指向一塊記憶體的指標 野指標的危害?如何避免野指標?我們要在以後養成良好的編碼習慣 1.將沒有指向的指標初始化指向null 指向null的指標不能對他的指向進行修改 2.當想給乙個指標指向的空間賦值時,一定要給這個指標分配空間 malloc 3.當空間分配完後,要檢查這個...