错误:在macOS上“未分配要分配的指针”,但在Windows上尝试重新分配两次时有效

时间:2018-10-04 13:28:16

标签: c memory memory-management malloc realloc

我正在尝试实现连接两个字符串的函数,但是我一直遇到相同的错误。 “未分配的指针未分配” 当我在Windows机器上编译相同的代码时,它起作用了,这是我所缺少的吗? 下面的代码基本上是我想要做的。 主要:

int main() {

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

createString:

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获得的字符串的长度,同时具有与发送的字符串相同的地址,以便稍后在我想添加另一个字符串时可以为其分配更多的内存。

4 个答案:

答案 0 :(得分:3)

有几个问题:

  1. realloc(string, (counter)*sizeof(char));是错误的,您需要string = realloc(string, (counter)*sizeof(char));,因为realloc 可能返回另一个地址。

  2. 呼叫createString(string, length);不会修改string

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

让我们按执行顺序进行操作。

fflush(stdin);undefined behaviour。如果您确实需要清除标准输入中的所有内容,则必须找到另一种方式(例如循环)。有些编译器/系统具有定义的实现,但我不会指望它。

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并确保重新分配的内存与以前相同。

答案 3 :(得分:0)

查看其他人关于您做错了什么的答案。但是,错误消息表示在MacOS上,realloc中的createString释放了原始string并分配了一个新的,现在是realloc中的main尝试realloc不再有效(已分配)的指针。在Windows上,内存没有在createString中释放,因此第二次调用realloc(在main中)得到了有效的指针。