Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
错误:";指针为realloc';“未分配d”;在macOS上,但在Windows上尝试两次realloc时仍有效_C_Memory_Memory Management_Malloc_Realloc - Fatal编程技术网

错误:";指针为realloc';“未分配d”;在macOS上,但在Windows上尝试两次realloc时仍有效

错误:";指针为realloc';“未分配d”;在macOS上,但在Windows上尝试两次realloc时仍有效,c,memory,memory-management,malloc,realloc,C,Memory,Memory Management,Malloc,Realloc,我试图实现一个连接两个字符串的函数,但我一直得到相同的错误。 “未分配要重新分配的指针” 当我在windows机器上编译相同的代码时,它起作用了,是不是我遗漏了什么? 下面的代码基本上就是我要做的。 主要内容: createString: void createString(char * string, int length) { char *copyAdress = string; char *temp =""; int counter2 = 0; fflush(stdin)

我试图实现一个连接两个字符串的函数,但我一直得到相同的错误。 “未分配要重新分配的指针” 当我在windows机器上编译相同的代码时,它起作用了,是不是我遗漏了什么? 下面的代码基本上就是我要做的。 主要内容:

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

有几个问题:

  • realloc(字符串,(计数器)*sizeof(字符))错误,您需要
    string=realloc(字符串,(计数器)*sizeof(字符))因为
    realloc
    可能会返回不同的地址

  • 调用
    createString(字符串,长度)不会修改
    字符串


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

    如果
    realloc
    某些内存,则指向原始内存的指针将无效(除非
    realloc
    失败并返回
    NULL
    )。因此,在同一个指针上调用两次
    realloc
    (如果第一次没有返回
    NULL
    ),应该是行不通的

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

    string++字符串时,code>是超级链接

    realloc(string, (counter)*sizeof(char));
    
    应该是

    char *temp = realloc(string, (counter)*sizeof(char));
    if (temp != NULL)
      string = temp;
    
    通过这种方式,您可以获得新的
    字符串所在的指针,但我建议您阅读的参考资料。从本质上说,您不知道它是否已被移动,从那时起,旧地址可能无效。因此,取消引用它也是未定义的行为

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

    同样的问题在第二个
    realloc
    中重复出现。您只需要知道第一次调用是错误的,因为第二次调用注意到您认为属于
    字符串的内容中没有有效数据



    关于您的评论:不能使用
    realloc
    ,也不能确保重新分配的内存与以前一样位于同一位置。

    查看其他人关于您做错了什么的答案。然而,eror消息意味着在MacOS上,
    createString
    中的
    realloc
    解除了原始
    字符串的分配并分配了一个新字符串,现在
    main
    中的
    realloc
    尝试
    realloc
    一个不再有效(已分配)的指针。在Windows上,未在
    createString
    中释放内存,因此
    realloc
    (在
    main
    中)的第二次调用被赋予一个有效指针。

    我的目标是使用createString更改main中字符串的大小,同时使用与以前相同的地址。然后我想给字符串添加更多的空间,这样我可以将另一个字符串连接到它……如果可以的话,
    realloc
    可能会返回0;t realloc,因此,
    tmpstring=realloc(…
    *string!=*temp
    只是与
    '\0'
    进行比较,因为
    temp
    。它不需要变得无效,因为realloc可以扩展内存。不过,它可能会。
    char *temp = realloc(string, (counter)*sizeof(char));
    if (temp != NULL)
      string = temp;