詳談C語言指針:free(p)與p=null區別


 

 

常聽老師講“不懂指針,就不要告訴別人你會C語言”,指針是C語言中一個重要的組成,它靈活高效,又難以琢磨,只有經過細心琢磨和理解,方能一探它的魅力。

使用一個指針首先是需要給它分配適當的空間大小,在使用完以后當然需要回收內存資源以免造成內存泄漏。

常見的內存分配:

 

#define  MAX  1000

char *p  = char  *mallocsizeof(MAX);

 

這樣我們就為p申請了一段大小為1000字節的內存,那么它在系統中是怎樣表示呢?

 

 

直到指針p使用完后,就輪到我們的 free(p)p=null;發揮作用了。

 

free(p);           //就是把大括號去掉,即系統將此段空間再次置為可用內存,這樣其他的分配就可以使用到

      p=null;          //就是把p指向的箭頭給去掉,指向null

 

很顯然如果沒有free(p);那給p分配的這段大小為1000的內存就永遠不能再使用,造成內存泄漏

如果沒有 p=null; p所指向的地址還是原來的

 

通過以下代碼看:

 

 1 #include <stdio.h>
 2 
 3 #include <stdlib.h>
 4 
 5 #include <string.h>
 6 
 7  
 8 
 9 #define MAX 1000
10 
11  
12 
13 int main()
14 
15 {
16 
17       char* pStr;
18 
19       //為pStr分配大小為MAX的空間
20 
21       pStr = (char *)malloc(sizeof(char) * MAX);
22 
23       //賦值字符串
24 
25       strcpy(pStr, "MagicYun");
26 
27       
28 
29       printf("String :%s\n", pStr);
30 
31       printf("Address :%p\n", pStr);
32 
33       
34 
35       //釋放pStar申請的空間
36 
37       free(pStr);   
38 
39       
40 
41       //再次打印pStr的內容和指向地址
42 
43       printf("String :%s\n", pStr);
44 
45       printf("Address :%p\n", pStr);
46 
47       
48 
49       //將pStr置為NULL
50 
51       pStr = NULL;
52 
53       printf("String :%s\n", pStr);
54 
55       printf("Address :%p\n", pStr);
56 
57       
58 
59       return 0;
60 
61 }

 

 Result:

 

 

通過這個結果,我們可以印證以上的敘述

 

在代碼中,我們經常會使用這樣的語句:

 

If(NULL != p)

{

      Do something; //p進行操作

}

 

如果你在這個判斷前面只是free(p),而沒有置為null,這個判斷仍成立,執行里面的就會出錯,因為p指向的地址的內容已經被清空,得不到程序想要的結果

 

所以在釋放一個指針free(p);p=null;是兩者缺一不可


免責聲明!

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



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