常聽老師講“不懂指針,就不要告訴別人你會C語言”,指針是C語言中一個重要的組成,它靈活高效,又難以琢磨,只有經過細心琢磨和理解,方能一探它的魅力。
使用一個指針首先是需要給它分配適當的空間大小,在使用完以后當然需要回收內存資源以免造成內存泄漏。
常見的內存分配:
#define MAX 1000
char *p = (char *)malloc(sizeof(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;是兩者缺一不可
