【linux c】什麼是野指標以及如何避免野指標_學習筆記_010
阿新 • • 發佈:2019-02-13
1.首先以一個示例來認識野指標:
#include <stdio.h>
int main()
{
int * p;
scanf("%d", p);
printf("%d\n", * p);
return 0;
}
該段程式編譯並未報任何錯誤,而執行之後,輸入具體值後,報段錯誤:
2
段錯誤
為什麼會出現段錯誤?
因為此處定義了一個區域性變數,系統隨機分配給p一個地址,往p儲存的隨機地址中賦值,該值不一定可用。
說了這麼多,那麼什麼是野指標?
野指標:隨機指向一塊記憶體指標。這樣的指標會導致記憶體洩漏(沒有讓p使用卻使用了)。
不可用記憶體區域主要分為兩塊:
①指向沒有訪問許可權的記憶體;
②指向已經釋放的記憶體。
但是為什麼有時候用了野指標,卻可以正常執行呢?
這就好比你在路上撿了一把鑰匙,雖然可以開對應的房間門,但是卻不能隨意去開人家的門,這是犯法。但是,當你撿到的鑰匙是自己家的,或者是女朋友家的,你就可以合法地開門了。
執行正常,就是因為野指標撿到了自己家的”鑰匙”。
2.如何避免野指標
以一個示例來講解如何避免野指標:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_SIZE sizeof(char) * 100 int main() { char *ptr = NULL; //若定義的指標沒有指向,則賦值為空 ptr = (char *)malloc(MAX_SIZE); //為指標分配動態記憶體空間 if(NULL == ptr) //判斷動態記憶體是否分配成功 { printf("error malloc\n"); exit(1); } memset(ptr, 0, MAX_SIZE); //對分配的記憶體進行初始化,初始化為0 scanf("%s", ptr); printf("ptr = %s\n",ptr); free(ptr); //指標使用完後釋放記憶體 ptr = NULL; //釋放後將指標置為空 return 0; }
野指標無法完全杜絕,但是通過如上的編碼規範,可以很大程度上避免野指標。