二級指針和野指針

1. 關於二級指針
例如:char **p;
這裏定義了一個二級指針變量p,p是一個指針變量,毫無疑問在32位系統下佔4個byte。
它與一級指針不同的是,一級指針保存的是數據的地址,二級指針保存的是一級指針的地址,佈局如下:

二級指針和野指針
2.“數組參數”和等效的“指針參數”
a. void fun(char a[3][4]); 等效爲:void fun(char (*p)[4]);
b. void fun(char *a[]); 等效爲:void fun(char **p);
C語言中,當一維數組作爲函數參數的時候,編譯器總是把它解析成一個指向其首元素首地址的指針。


3. 常見的內存訪問錯誤及對策
a.野指針:指針沒有指向一塊合法的內存,屬於沒有人“看管”狀態,如果想它處於“被看管”狀態,需要把它初始化爲“NULL”,這個0地址處的地方就相當於一根繩子把它綁定好了,不許亂動。
eg: 結構體成員指針未初始化
struct student
{
   char *name;
   int score;
}stu,*pstu;

int main(void)
{
   strcpy(stu.name,"Jimy");
   stu.score = 98;
   return 0;
}

編譯時,沒有出現錯誤,但在運行時出現中斷異常。這裏定義了結構體變量stu,但是沒有想到這個結構體內部的char *name這個成員在定義結構體變量stu時,只是給name這個指針變量本身分配了4個字節。name指針並沒有指向一個合法的地址,這個時候,其內部存的只是一些亂碼。所以在調用strcpy函數時,會將字符串"Jimy"往亂碼所在的內存中拷貝,而這塊內存name指針根本就無權訪問,導致出錯。解決方法:爲name指針malloc一塊空間。

下面這個方法也是不正確的:
int main(void)
{
   pstu = (struct student*)malloc(sizeof(struct student));
   strcpy(pstu->name,"Jimy");
   pstu->score = 98;
   free(pstu);
   return 0;
}
這裏爲指針變量pstu分配了內存,但是同樣沒有給name指針分配內存。
正確方法:
int main(void)
{
   pstu = (struct student*)malloc(sizeof(struct student));
   pstu->name = (char *)malloc(10);
   strcpy(pstu->name,"Jimy");
   pstu->score = 98;
   free(pstu->name);//注意指針釋放順序
   free(pstu);
   return 0;
}

b. 關於free();
我們在進行了malloc函數之後,一定要把內存經行釋放,否則這個內存將一直伴隨程序,一直到程序結束,造成不安全因素。使用free函數的時候一定要注意把指針變量置爲NULL,因爲使用free函數之後,指針變量p本身保存的地址並未改變,只是p所指向的內存被釋放。
eg:
char *p = (char*)malloc(100);
strcpy(p,"hello");
free(p);

//未起到防護作用
if(NULL != p)
{
   strcpy(p,"world");//出錯!
}
這裏在釋放完內存之後,沒有把指針置爲NULL,這個指針就成爲了“野指針”,這是很危險的,一定記住要在free之後,把相應指針置爲NULL。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章