c – 正常阻塞后检测到堆损坏(#174)
作者:互联网
我知道这个问题已被问到我无法修复我的程序
void swap1(char*str1,char*str2)
{
char *ezer =new char[strlen(str1)];
for (int i = 0 ; i <= strlen(str1);i++)
ezer[i]=str1[i];
delete [] str1;
str1= new char[strlen(str2)];
for (int i = 0 ; i <= strlen(str2);i++)
str1[i]=str2[i];
delete [] str2;
str2= new char[strlen(ezer)];
for (int i = 0 ; i <= strlen(ezer);i++)
str2[i]=ezer[i];
delete[] ezer;
}
有一次第一次它的工作蝙蝠在第二次(有其他值)时间我得到一个错误
错误发生在最后一行delete [] ezer;为什么我不能删除ezer?
错误:
heap corruption detected after normal block (#174) at 0x007D7A48
CRT detected that the application wrote to memory end of heap buffer
解决方法:
strlen不计算字符串末尾的null终止符.这意味着在交换函数的一次应用之后,将交换两个字符串,但不再为null终止. strlen在没有null终止符的字符串上的行为是未定义的,这意味着当您遍历其中一个butchered字符串时,您正在分配堆的边界外运行.
C中的字符串表示为一个字符指针,其零值字节表示字符串的结尾(我提到的空终止符).任何对“字符串”进行操作的库例程都需要提供一个字符数组,其末尾标记为null,否则将具有未定义的行为(因为您将提供一个char数组,而不是此时的字符串).
使用库函数strcpy而不是自己滚动.
有关详情,请参见this question.
标签:heap-corruption,c,char,swap 来源: https://codeday.me/bug/20190901/1781341.html