Error :"pointer being realloc'd was not allocated" on macOS but works on Windows when trying to realloc twice

Error :"pointer being realloc'd was not allocated" on macOS but works on Windows when trying to realloc twice

我正在尝试实现一个连接两个字符串的函数,但我总是遇到同样的错误。 "pointer being realloc'd was not allocated" 当我在 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可能return一个不同的地址.

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

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

如果你 realloc 一些内存,指向原始内存的指针将变得无效(除非 realloc 失败并且 returned NULL)。所以在同一个指针上调用 realloc 两次确实应该不起作用(如果第一次没有 return NULL)。

让我们按执行顺序来解决这个问题。

fflush(stdin);undefined behaviour。如果你真的需要清除标准输入中的所有内容,你必须找到另一种方法(例如循环)。有 compilers/systems 具有定义的实现,但我不会指望它。

string++; 是多余的,因为您在循环后覆盖 string

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

应该是

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

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

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

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


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

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