我知道有人问过这个问题 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/

10-11 18:46