C語言野指標的產生原因及避免辦法
阿新 • • 發佈:2019-02-19
見如下程式例項:
#include <stdio.h> #include <stdlib.h> int main() { char *p1 = NULL; printf("p1:%d, &p1:%d\n",p1,&p1); p1 = (char*)malloc(100); //為p1在堆區分配空間 if(p1 == NULL) //若為空直接return出程式 { return; } printf("p1:%d, &p1:%d\n",p1,&p1); if(p1 != NULL) //目的:釋放p1 { free(p1); //只釋放了p1指向的堆區空間 並沒有將指標p1置為空 } printf("p1:%d, &p1:%d\n",p1,&p1); system("pause"); return 0; }
程式執行結果為:
p1:0, &p1:2031188
p1:2233584, &p1:2031188
p1:2233584, &p1:2031188
請按任意鍵繼續. . .
由結果看出,p1並不為0,也就是在釋放p1時,僅僅釋放的是p1指向的記憶體空間,並沒有將指標p1指為空,此時p1就成了野指標!
避免策略--養成一個習慣:
1、在定義一個指標時初始化為NULL
2、釋放指標指向的記憶體空間時,將指標重置為NULL
即修改後上述例項程式碼為:
#include <stdio.h> #include <stdlib.h> int main() { char *p1 = NULL; printf("p1:%d, &p1:%d\n",p1,&p1); p1 = (char*)malloc(100); //為p1在堆區分配空間 if(p1 == NULL) //若為空直接return出程式 { return; } printf("p1:%d, &p1:%d\n",p1,&p1); if(p1 != NULL) //目的:釋放p1 { free(p1); //只釋放了p1指向的堆區空間 並沒有將指標p1置為空 p1 = NULL; //--------------------------------------------重新置為空 } printf("p1:%d, &p1:%d\n",p1,&p1); system("pause"); return 0; }
參考:傳智播客掃地僧老師