日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C语言Free时报错HEAP CORRUPTION DETECTED

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言Free时报错HEAP CORRUPTION DETECTED 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

char *k1;

k1 = (char *) malloc(4*sizeof(char));

v1 = (char *) malloc(4*sizeof(char));?
strcpy(k1,"abcd");

free(k1);

?

在linux下不會報錯,但是在VC++環境會報錯:HEAP CORRUPTION DETECTED

?

出現這個錯誤的原因一般都是操作new申請的內存溢出,因為在VC中,如果用malloc動態分配一段內存,操作的時候改變了該部分的大小,在free時就會出錯.比如說上面
這段代碼就會出錯,因為申請了一個size為4的內存,但是strcpy過去了一個size為5的字符串,因此破壞了這個指針,運行debug版本的時候就會出現先前的錯誤,但是在release版本中,溢出一個字節的內存很有可能是沒有錯誤的,然后潛在的隱患是肯定存在的,因此,我們在debug遇到這樣的錯誤時候一定要仔細檢查對malloc出的指針的操作.

strcpy(s1,s2);strcpy函數的意思是:把字符串s2中的內容copy到s1中,連字符串結束標志也一起copy.
這樣s1在內存中的存放為:ch\0;

修改正確的代碼:

char *k1;

k1 = (char *) malloc(5*sizeof(char));

v1 = (char *) malloc(5*sizeof(char));?
strcpy(k1,"abcd");

free(k1);

?

進一步分析一下strcpy函數的源代碼,代碼如下:

char *strcpy(char *strDestination, const char *strSource)

  {

  assert(strDestination && strSource);

  char *strD=strDestination;

  while ((*strDestination++=*strSource++)!='\0')

  NULL;

  return strD;

  }

最重要一條語句為:while ((*strDestination++=*strSource++)!='\0') ,意思是先將第二參數當前指針所指內容賦值給第一個參數當前指針所指空間,直到第二參數當前指針所指內容為'\0',將'\0'賦值給第一個參數后結束,因為第一個參數當前指針也是不斷自加的,跟第一個參數所具有的存儲空間的大小沒有關系,他們會一直賦值,超過第一參數存儲空間也沒有關系,直到第二參數遇到'\0'為止。

?

?

參考:heap corruption detected

http://blog.csdn.net/maintyb011/article/details/6562715

總結

以上是生活随笔為你收集整理的C语言Free时报错HEAP CORRUPTION DETECTED的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。