3

我知道有人问过这个问题,我无法修复我的程序

  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
4

2 回答 2

5

strlen 不计算字符串末尾的空终止符。这意味着在您的交换函数应用一次之后,两个字符串将被交换,但将不再以空值结尾。strlen 在没有空终止符的字符串上的行为是未定义的,这意味着当您遍历其中一个被屠杀的字符串时,您正在分配堆的边界之外运行。

C 中的字符串表示为带有零值字节的字符指针,指示字符串的结尾(我提到的空终止符)。任何对“字符串”进行操作的库例程都需要提供一个以 null 结尾的字符数组,否则将具有未定义的行为(因为此时您将提供一个 char 数组,而不是字符串)。

使用库函数 strcpy 而不是自己滚动。

有关详细信息,请参阅此问题

于 2013-03-01T07:31:15.127 回答
0

您在这里缺少为 0 终止符分配空间:

char *ezer = new char[strlen(str1)];

将其更改为:

char *ezer = new char[strlen(str1) + 1];

实际的(第一次)内存损坏发生在这里:

  for (int i = 0 ; i <= strlen(str1);i++)
    ezer[i]=str1[i];

与最后一次迭代(复制 0 终止符的那个)一样,指的ezer[i]是内存“就在”分配给ezer.

对字符数组c 的其他两个分配重做相同的操作。

无论如何,由于这将修复堆损坏,因此该函数不会按预期运行。但这是另一个故事……不是吗?;-)

于 2013-03-01T07:57:02.800 回答