1. 程式人生 > >C語言野指標的產生原因及避免辦法

C語言野指標的產生原因及避免辦法

見如下程式例項:
#include <stdio.h>
#include <stdlib.h>

int main()
{
	char *p1 = NULL;
	printf("p1:%d, &p1:%d\n",p1,&p1);

	p1 = (char*)malloc(100);	//為p1在堆區分配空間
	if(p1 == NULL)				//若為空直接return出程式
	{
		return;
	}
	printf("p1:%d, &p1:%d\n",p1,&p1);

	if(p1 != NULL)				//目的:釋放p1
	{
		free(p1);			//只釋放了p1指向的堆區空間  並沒有將指標p1置為空
	}
	printf("p1:%d, &p1:%d\n",p1,&p1);


	system("pause");
	return 0;
}

程式執行結果為:

p1:0, &p1:2031188
p1:2233584, &p1:2031188
p1:2233584, &p1:2031188
請按任意鍵繼續. . .

由結果看出,p1並不為0,也就是在釋放p1時,僅僅釋放的是p1指向的記憶體空間,並沒有將指標p1指為空,此時p1就成了野指標!

避免策略--養成一個習慣:

1、在定義一個指標時初始化為NULL

2、釋放指標指向的記憶體空間時,將指標重置為NULL

即修改後上述例項程式碼為:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char *p1 = NULL;
	printf("p1:%d, &p1:%d\n",p1,&p1);

	p1 = (char*)malloc(100);	//為p1在堆區分配空間
	if(p1 == NULL)				//若為空直接return出程式
	{
		return;
	}
	printf("p1:%d, &p1:%d\n",p1,&p1);

	if(p1 != NULL)				//目的:釋放p1
	{
		free(p1);			//只釋放了p1指向的堆區空間  並沒有將指標p1置為空
		p1 = NULL;			//--------------------------------------------重新置為空
	}
	printf("p1:%d, &p1:%d\n",p1,&p1);


	system("pause");
	return 0;
}

參考:傳智播客掃地僧老師