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下不會(huì)報(bào)錯(cuò),但是在VC++環(huán)境會(huì)報(bào)錯(cuò):HEAP CORRUPTION DETECTED
?
出現(xiàn)這個(gè)錯(cuò)誤的原因一般都是操作new申請(qǐng)的內(nèi)存溢出,因?yàn)樵赩C中,如果用malloc動(dòng)態(tài)分配一段內(nèi)存,操作的時(shí)候改變了該部分的大小,在free時(shí)就會(huì)出錯(cuò).比如說(shuō)上面
這段代碼就會(huì)出錯(cuò),因?yàn)樯暾?qǐng)了一個(gè)size為4的內(nèi)存,但是strcpy過(guò)去了一個(gè)size為5的字符串,因此破壞了這個(gè)指針,運(yùn)行debug版本的時(shí)候就會(huì)出現(xiàn)先前的錯(cuò)誤,但是在release版本中,溢出一個(gè)字節(jié)的內(nèi)存很有可能是沒(méi)有錯(cuò)誤的,然后潛在的隱患是肯定存在的,因此,我們?cè)赿ebug遇到這樣的錯(cuò)誤時(shí)候一定要仔細(xì)檢查對(duì)malloc出的指針的操作.
strcpy(s1,s2);strcpy函數(shù)的意思是:把字符串s2中的內(nèi)容copy到s1中,連字符串結(jié)束標(biāo)志也一起copy.
這樣s1在內(nèi)存中的存放為:ch\0;
修改正確的代碼:
char *k1;
k1 = (char *) malloc(5*sizeof(char));
v1 = (char *) malloc(5*sizeof(char));?
strcpy(k1,"abcd");
free(k1);
?
進(jìn)一步分析一下strcpy函數(shù)的源代碼,代碼如下:
char *strcpy(char *strDestination, const char *strSource)
{
assert(strDestination && strSource);
char *strD=strDestination;
while ((*strDestination++=*strSource++)!='\0')
NULL;
return strD;
}
最重要一條語(yǔ)句為:while ((*strDestination++=*strSource++)!='\0') ,意思是先將第二參數(shù)當(dāng)前指針?biāo)竷?nèi)容賦值給第一個(gè)參數(shù)當(dāng)前指針?biāo)缚臻g,直到第二參數(shù)當(dāng)前指針?biāo)竷?nèi)容為'\0',將'\0'賦值給第一個(gè)參數(shù)后結(jié)束,因?yàn)榈谝粋€(gè)參數(shù)當(dāng)前指針也是不斷自加的,跟第一個(gè)參數(shù)所具有的存儲(chǔ)空間的大小沒(méi)有關(guān)系,他們會(huì)一直賦值,超過(guò)第一參數(shù)存儲(chǔ)空間也沒(méi)有關(guān)系,直到第二參數(shù)遇到'\0'為止。
?
?
參考:heap corruption detected
http://blog.csdn.net/maintyb011/article/details/6562715
總結(jié)
以上是生活随笔為你收集整理的C语言Free时报错HEAP CORRUPTION DETECTED的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: GCC编译选项--创建与使用库
- 下一篇: 深度分析typedef--定义自己的数据