野指標和free總結超有用的資料
阿新 • • 發佈:2020-12-23
在C語言專案中,經常會遇到需要程式設計師手動分配記憶體的地方。這樣做能夠節省大量的記憶體空間,也讓程式更加靈活。只要你有一定的基礎,那麼肯定用過 malloc 或者 ralloc和free的組合。這個組合使用起來有一個需要注意的地方,不知道你有沒有發現。
野指標是什麼?
根據百度百科的說法,野指標是指 指向一個已刪除的物件或未申請訪問受限記憶體區域的指標.
我這裡是這樣理解的,野指標就是指向的記憶體區域不合法,這裡的不合法主要包括以下幾個方面:
1. 所指向的記憶體未申請
2.所指向的記憶體被釋放
當你訪問一個未申請的記憶體區域時,系統會判定我們沒有許可權,無法訪問。記憶體被釋放後你再訪問,結果完全不可預知,很大機率會出現段錯誤(segmentation fault),這是提示你訪問越界了。
野指標怎麼出現的?
在程式碼中以下幾種情況會出現野指標:
1.指標聲明後未初始化
這種情況下編譯器一般會給出一個 warning警告,自己要注意避免。
2.指標指向的空間被free後,沒有被重置為NULL,或者指向一個有效的記憶體區域、
在free後要及時處理被free的指標,例如令其指向NULL。
野指標該如何避免?
1.在指標宣告時,要養成將其初始化的習慣。如下:
int *p = NULL;
預設將其初始化為NULL
2.在free後面,加上重置指標的程式碼,如下:
free(p);
p = NULL;
重置為NULL
為了便於理解,下面貼上一份程式碼:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
char *p = NULL; //初始化為NULL
p = (char *)malloc(100);
if(p==NULL)
{
return 0;
}
strcpy(p,"12321323213"); //向記憶體拷貝值
printf("p : %s\n",p); //列印值
if(p!=NULL)
{
free(p);
p = NULL; //在釋放完後,再將指標的值置為空
}
//free釋放的是指標所指向的記憶體空間,而不是指標的值。
//所以釋放後指標還是指向原來的地址
if(p1!=NULL)
{
free(p1); //如果再次釋放,就會出現野指標錯誤。
}
getchar();
return 0;
}
參考學習資料
指標
http://www.makeru.com.cn/live/1392_238.html?s=45051
C語言控制led燈
http://www.makeru.com.cn/live/1392_304.html?s=45051
輸入和輸出
http://www.makeru.com.cn/live/1758_312.html?s=45051
C語言玩轉連結串列