Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c:realloc()*char[]之后的双链接列表已损坏_C_Arrays_Dynamic - Fatal编程技术网

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

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

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

当我尝试在一个长度超过30个字符的数组中输入字符串_时,出现错误“损坏的双链接列表”。该错误似乎来自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;

}

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

无论如何,你的问题是:

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进行变异,但不会将其返回给调用方。谢谢,我才意识到这甚至是一个问题,您的回答帮助快速解决了它。