c语言 - 错误:在 macOS 上"pointer being realloc'd was not allocated",但在尝试重新分配两次时在 Windows 上工作



我正在尝试实现一个连接两个字符串的函数,但我不断收到相同的错误。 "未分配正在重新分配的指针" 当我在Windows机器上编译相同的代码时,它起作用了,是我缺少的东西吗? 下面的代码基本上是我正在尝试做的。 主要:

int main() {
int length = 4096;
char *string = malloc(length * sizeof(char));
createString(string, length);
realloc(string, 30);
return 0;
}

创建字符串:

void createString(char * string, int length) {
char *copyAdress = string;
char *temp ="";
int counter2 = 0;
fflush(stdin);
fgets(string, length,stdin);
while(*string != EOF && *string != *temp ) {
string++;
counter++;
}
string = copyAdress;
realloc(string, (counter)*sizeof(char));
}

谢谢! 编辑: 我希望 createString 将字符串的大小更改为我使用 fgets 获得的字符串的长度,同时具有与我发送的字符串相同的地址,以便我以后在想要添加另一个字符串时可以为它分配更多内存。

有几个问题:

  1. realloc(string, (counter)*sizeof(char));错了,你需要string = realloc(string, (counter)*sizeof(char));,因为realloc可能会返回不同的地址。

  2. 调用createString(string, length);不会修改string

如果你想要一个更准确的答案,你需要告诉我们createString到底应该做什么。在您的代码中,没有尝试连接两个字符串。

让我们按执行顺序完成此操作。

fflush(stdin);是未定义的行为。如果你真的需要清除stdin中的所有内容,你必须找到另一种方式(例如循环(。有一些编译器/系统具有定义的实现,但我不会指望它。

string++;是超浮的,因为您在循环后覆盖string

realloc(string, (counter)*sizeof(char));

应该是

char *temp = realloc(string, (counter)*sizeof(char));
if (temp != NULL)
string = temp;

这样,您可以获得新string所在的指针,但我建议您阅读realloc的参考。从本质上讲,您不知道它是否已被移动,并且旧地址从那时起可能无效。因此,取消引用它也是一种未定义的行为。

在此之后,您必须返回string的新地址或将指针的地址传递给您的函数。

同样的问题在第二个realloc重复。你只知道你的第一个电话是错误的,因为第二个电话注意到你认为是你的string没有有效的数据。


关于您的评论:无法使用realloc并确保重新分配的内存与以前位于同一位置。

如果realloc一些内存,则指向原始内存的指针将变为无效(除非realloc失败并返回NULL(。因此,在同一指针上调用realloc两次确实应该不起作用(如果第一次没有返回NULL(。

看看别人对你做错了什么的回答。但是,错误消息意味着在 MacOS 上,createString中的realloc解除分配了原始string并分配了一个新,现在您在main中的realloc尝试realloc不再有效(已分配(的指针。在 Windows 上,内存未在createString中释放,因此第二次调用realloc(在main中(被赋予一个有效的指针。

相关内容

最新更新