我正在尝试实现一个连接两个字符串的函数,但我不断收到相同的错误。 "未分配正在重新分配的指针" 当我在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 获得的字符串的长度,同时具有与我发送的字符串相同的地址,以便我以后在想要添加另一个字符串时可以为它分配更多内存。
有几个问题:
-
realloc(string, (counter)*sizeof(char));
错了,你需要string = realloc(string, (counter)*sizeof(char));
,因为realloc
可能会返回不同的地址。 -
调用
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
中(被赋予一个有效的指针。