c:realloc()*char[]之后的双链接列表已损坏
所以我用c写,我有一个字符指针数组,我用它作为动态数组(char*chat[chat_ROWS]),我还有一个函数将一个字符数组复制到另一个字符数组中(如下),对copy_String()的特定调用产生一个错误,使用chat[chat_ROWS-1]作为字符串 当我尝试在一个长度超过30个字符的数组中输入字符串_时,出现错误“损坏的双链接列表”。该错误似乎来自high和mid之间对realloc()的第二次调用c:realloc()*char[]之后的双链接列表已损坏,c,arrays,dynamic,C,Arrays,Dynamic,所以我用c写,我有一个字符指针数组,我用它作为动态数组(char*chat[chat_ROWS]),我还有一个函数将一个字符数组复制到另一个字符数组中(如下),对copy_String()的特定调用产生一个错误,使用chat[chat_ROWS-1]作为字符串 当我尝试在一个长度超过30个字符的数组中输入字符串_时,出现错误“损坏的双链接列表”。该错误似乎来自high和mid之间对realloc()的第二次调用 void Copy_String(char *string_out, char *s
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;
}这是一种非常慢的复制字符串的方法,因为在复制每个字符之前要分配内存 无论如何,你的问题是:
string_out = (char *)realloc(string_out, i * sizeof(char));
请注意,在第一次交互中,“i”将为零,因此您将分配“0字节”,结果为null。最后,您写入null
因此,将代码替换为:
string_out = (char *)realloc(string_out, (i + 1) * sizeof(char));
应该有用
另外,正如其他人所指出的,您应该将字符串返回给调用者,否则,您将失去所有工作。如果您在函数中重新定位字符串指针参数,则必须返回它。否则,函数返回后传入的参数很可能无效。如果分配长度为i的数组,则有效索引为0到i-1。因此,写入
string_out[i]
超出了数组并破坏了内存。“我还有一个函数可以将一个字符数组复制到另一个字符数组中”-您没有使用已经提供的标准库函数来执行此操作的原因是。。。?我假设它没有像这样毫无意义的重新分配(即首先从源计算所需的大小,然后再分配一次目标)。我不明白。这个函数应该返回什么吗?它通过调用realloc()来改变“string_out”指针,但不返回它。这段代码有很多错误。我喜欢为类似这样的东西编写自己的函数,以便更容易理解错误。我正在使用string_out指针作为返回值。请注意,函数会对string_out进行变异,但不会将其返回给调用方。谢谢,我才意识到这甚至是一个问题,您的回答帮助快速解决了它。