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