C中的野指針—如何避免


轉自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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM