我知道有人问过这个问题 bat 我无法修复我的程序
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 不计算字符串末尾的空终止符。这意味着在您的交换函数应用一次之后,两个字符串将被交换,但不再以空字符结尾。 strlen 在没有空终止符的字符串上的行为是未定义的,这意味着当您遍历这些被删除的字符串之一时,您正在分配的堆的边界之外运行。
C 中的字符串表示为一个字符指针,其中一个零值字节表示字符串的结尾(我提到的空终止符)。任何对“字符串”进行操作的库例程都希望提供一个以 null 结尾的字符数组,否则将具有未定义的行为(因为此时您将提供一个字符数组,而不是字符串)。
使用库函数 strcpy 而不是滚动你自己的。
有关详细信息,请参阅 this question。
关于c++ - 正常块后检测到堆损坏(#174),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15152609/