C語言 C語言野指標

gaopengtttt發表於2016-12-22
關於野指標也就是進行了記憶體free後,其指標變數指向的記憶體空間已經free掉了,但是指標變數其值並沒有釋放,可能造成
二次釋放的導致程式崩潰。
考慮如下的程式



點選(此處)摺疊或開啟

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. #define xfree(p) {if(p!=NULL);{free(p);p=NULL;}}



  5. int getstr( char **p/*out*/,int *len/*out*/)
  6. {
  7.         *p = (char *)malloc(4094);
  8.         strcpy(*p,"testesest");
  9.         *len = strlen(*p);

  10.         return 0;
  11. }




  12. int main()
  13. {
  14.         char *p = NULL;
  15.         int len = 0;

  16.         getstr(&p,&len);

  17.         printf("%s %d\n",p,len);

  18.         if(p!=NULL)
  19.         {
  20.                 free(p); //釋放指標p指向的記憶體空間,但是指標變數本身的值還存在
  21.                 printf("%p\n",p);//列印出來
  22.         }

  23.         if(p!=NULL) //條件還是成立因為p變數本身沒有改變
  24.         {
  25.                 free(p);//記憶體不存在了,再次釋放程式崩潰
  26.         }
  27. }
我們有必要畫出他的記憶體四區圖如下:



實際上free(p)的時候,只是free了指標p指向的堆疊的記憶體空間,而指標p的
變數0X25C1010這個值還在,如下:


記住指標p也是需要在棧上開闢空間的,實際上
我們只需要在free(p)後將p=NULL,將指標的值賦予0,那麼下次釋放的時候加
上p!=NULL即可,我們可以定義一個巨集:
#define xfree(p) {if(p!=NULL);{free(p);p=NULL;}}
來完成所有的操作如下:

點選(此處)摺疊或開啟

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. #define xfree(p) {if(p!=NULL);{free(p);p=NULL;}}



  5. int getstr( char **p/*out*/,int *len/*out*/)
  6. {
  7.         *p = (char *)malloc(4094);
  8.         strcpy(*p,"testesest");
  9.         *len = strlen(*p);

  10.         return 0;
  11. }




  12. int main()
  13. {
  14.         char *p = NULL;
  15.         int len = 0;

  16.         getstr(&p,&len);

  17.         printf("%s %d\n",p,len);
  18.         xfree(p); //使用巨集
  19.         xfree(p);

  20. }



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2131193/,如需轉載,請註明出處,否則將追究法律責任。

相關文章