【问题标题】:c: corrupted double-linked list after realloc() *char[]c: realloc() *char[] 后损坏的双链表
【发布时间】:2016-02-15 13:45:08
【问题描述】:

所以我用 c 编写,我有一个字符指针数组,我将其用作动态数组 (char *chat[CHAT_ROWS]),我还有一个函数可以将一个字符数组复制到另一个数组字符(如下),产生错误的对 Copy_String() 的特定调用使用 chat[CHAT_ROWS - 1] 作为 string_out。

当我尝试在超过 30 个字符长的数组中输入 string_in 时,我收到错误“损坏的双链表”。错误似乎来自 high 和 mid 之间对 realloc() 的第二次调用。

void Copy_String(char *string_out, char *string_in)
{
int i;

printf("first\n");
string_out = (char *)realloc(string_out, 0);

i = 0;
while(string_in[i] != '\0')
{
    printf("high\n");
    string_out = (char *)realloc(string_out, i * sizeof(char));
    printf("mid\n");
    string_out[i] = string_in[i];
    printf("low\n");
    i += 1;
}
string_out = (char *)realloc(string_out, i * sizeof(char));
string_out[i] = '\0';

printf("end\n");
return;

}

【问题讨论】:

  • 如果分配长度为 i 的数组,则有效索引为 0i - 1。所以写入string_out[i] 是在数组之外并且会破坏内存。
  • “我还有一个函数可以将一个字符数组复制到另一个字符数组中” - 您没有使用已经提供的标准库函数来执行此操作的原因是......?我假设它没有充满像这样毫无意义的重新分配(即首先从源计算所需的大小,然后分配一次目标)。
  • 我不明白。这个函数应该返回一些东西吗?它通过调用 realloc() 来改变 'string_out' 指针,但不返回它。
  • 这段代码有很多问题。
  • 我喜欢为这样的东西制作自己的函数,这样我就可以更容易地理解错误。我正在使用 string_out 指针作为返回值。

标签: c arrays dynamic


【解决方案1】:

如果您在函数中重新分配字符串指针参数,则必须返回它。如果不这样做,在函数返回后传入的参数很可能是无效的。

【讨论】:

  • 谢谢,我才意识到这甚至是一个问题,您的回答帮助快速解决了它。
【解决方案2】:

这是一种复制字符串的非常慢的方法,因为您在复制每个字符之前分配内存。

不管怎样,你的问题就在这里:

string_out = (char *)realloc(string_out, i * sizeof(char));

请注意,在第一次交互中,“i”将为零,因此您将分配“0 字节”,从而导致 null。最后,你写到 null。

所以将代码替换为:

string_out = (char *)realloc(string_out, (i + 1) * sizeof(char));

应该可以。

另外,正如其他人所说,您应该将 string_out 返回给调用者,否则,您将失去所有工作。

【讨论】:

  • 请注意,该函数会改变 string_out,但不会将其返回给调用者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多