1. 程式人生 > 實用技巧 >野指標和free總結超有用的資料

野指標和free總結超有用的資料

在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語言玩轉連結串列

http://www.makeru.com.cn/live/1392_338.html?s=45051