指針賦值為NULL;是什么意思呢?(轉)


 

int *p=NULL;這個NULL是什么意思?

    網上百度了下,有人說NULL=0;是在頭文件中定義的;

    首先要說的是:非堆分配的內存是不需要free的。
    再說p=NULL;指針的變化是 p指向了一個地址為0的內存,這就提醒別人不要對這個指針進行解引用的操作。NULL其實就是0x0。p=NULL后,p指向0x0這個地址。此處的地址,你沒有訪問權限。

     空指針指沒有定位內存的指針,值為null(0),你使用new或者malloc申請了指針p,使用后delete或者free,你必須將指針值設置為null,否則,p將成為一個非法指針,后續代碼如果使用到該指針有可能會造成系統崩潰(內存不可以讀不可寫),或者,破壞自身有效內存數據(釋放后,又在申請作為別的用途,恰巧系統分配了同一塊內存)

     free(p)是只是將malloc申請的內存空間釋放,在不改變free()函數的原型前提下是無法做到P=NULL的,P=NULL相當於空指針,不指向任何有效的對象。絕對不允許間接使用空指針,否則程序會得到毫無用處的結果或者全部是零的值,或者會突然停止。P=null,之后,p還是原來的類型的,不變的。


    比如說 我定義了一個整形變量 int a = 1;  同時定義了一個指針p指向這個變量a: int  *p = &a;
但我用完這個變量和指針的時候我把指針所指向的內存空間釋放掉:free(p);這個時候p所指向的內存空間里面的數據1被清空的,但是指針p里面仍然存有一個地址(原來指向a變量內存空間的地址),此時通常再要把指針p設置成空指針:P = NULL。我的問題來了:從free(p);這條語句到p = NULL;這條語句,指針p的狀態發生了哪些變化,到底什么樣的指針才叫空指針?是不是P = NULL;之后,p里面所存放的地址就為空了?是這樣理解嗎?此時p還有指向的數據類型嗎?比如說p還是一個int *型的指針嗎?
 還有通常用if (p != NULL)來預防錯誤,就是說如果當指針p為空指針的時候,這個指針就最好不要用,要不然可能會發生內存泄露、空指針一場等錯誤,為什么呢?

1. int *p = &a; 這樣的指針不可用 free , free 只是針對 malloc, realloc 的內存進行釋放。
2. 空指針是指指針指向地址0,如果是你分配的內存,並且使用 free 釋放,然后把指針置成 0 ,只是為了不進行非法的引用。

char* tmp = (char*)malloc(1024);
free(tmp);
tmp = 0;

在 free 后,如果后面再引用 tmp, 因為是個空指針,會導致進行崩潰。
如果不置為0,比如
char* tmp = (char*)malloc(1024);
free(tmp);
char* tmp2 = (char*)malloc(1024);
memset(tmp, 0, 1024);
這樣,由於堆管理特性,很可能 memset(tmp, 0, 1024)寫了 tmp2 指向的空間。
這樣,釋放完 tmp 后,再使用它,謂之野指針。
使用野指針會造成不可預期的后果,而使用空指針會造成比較確定的后果:崩潰。
所以 釋放完后給指針賦成空,很大程度是避免以后錯誤地使用指針。

 

free(p)//報告系統,我要釋放內存,系統就將該內存塊標記為未使用,但不影響p的值
p = NULL//free被執行后,你需要將該指針標記為空,因為p指向的內存以被系統收回,不屬於你的程序
這兩個語句一般是在一起使用的

總結:為了避免野指針,定義指針的時候必須給指針初始化(以防指針空間的數據沒有及時清空),用free(P)釋放掉指針所指的內存空間后,必須立即同時把p賦值為NULL,避免后面程序指針P而導致意想不到的錯誤,甚至系統崩潰!

轉自:http://blog.csdn.net/gplwz_1314/article/details/22780151


免責聲明!

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



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