c:realloc()* char []后损坏的双链表

时间:2016-02-15 13:45:08

标签: c arrays dynamic

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

我收到错误"损坏的双链表"当我尝试为一个长度超过30个字符的数组提供string_in时。该错误似乎来自高级和中级之间第二次调用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;

}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

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

无论如何,你的问题在这里:

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返回给调用者,否则你将失去所有的工作。