轉自http://www.cnblogs.com/evisie/archive/2011/08/04/2128051.html
先看一個例子:
struct student
{
char* name;
int score;
}stu, *pstu;
int main(void)
{
strcpy(stu.name, "Jimy");
stu.score =99;
return0;
}
這是很多人都容易犯的錯誤:定義了結構體變量stu,但結構體內部的char * name在定義結構體時只是為其分配了4字節的內存,沒有指向一個合法的地址,這時其指針指向的區域只是一些亂碼,有事還沒有訪問權限。這就是我們通常所說的野指針,它是許多程序bug的根源。
為了避免出現野指針,通常我們需要將指針初始化為NULL,用完后也為其賦值為NULL。
結構體成員指針往往會被我們忽視,注意它也需要初始化,且需要為結構體指針分配足夠的內存,真是就用到了malloc這個宏,使用方法如下:
給指針變量賦初值:
方法一:char * p = (char * )malloc(sizeof(char));
方法二:char * p = NULL;
給數組賦初值:
方法一: int a[10] = {0};
方法二: memset(a, 0, sizeof(a));
memset函數有3個參數:第一個是要被設置的內存起始地址;第二個是要被設置的值;第三個是要被設置的內存大小,單位為字節;
給結構體指針賦初值:
方法一: pstu = (struct student *)malloc(sizeof(struct student));
常見錯誤: pstu = (struct student *)malloc(sizeof(struct student *));
為了避免出現野指針,在程序的debug版本里可以如下處理:
在函數的入口處使用assert(NULL != p)對參數進行校驗。或者用if(NULL != p)來校驗。它會提醒我們有沒有初始化指針,起到定位錯誤的功能。
assert是個宏,它后面括號里的條件若不滿足,則程序終止運行並提示出錯。
使用完指針后務必記得釋放指針所指向的內存,否則不知道什么時候我們又改變了指針的值,使其變成了野指針!
這里就需要free(p)這個函數的幫忙了,它可以切斷指針與指向內存的聯系。但是需要注意的是free對於同一指針變量只能使用一次。不然會導致出錯或者內存泄漏。
釋放完內存后另指針的值變為NULL!
如下:
free(p);
p = NULL;

