我正在尝试实现连接两个字符串的函数,但是我一直遇到相同的错误。 “未分配的指针未分配” 当我在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获得的字符串的长度,同时具有与发送的字符串相同的地址,以便稍后在我想添加另一个字符串时可以为其分配更多的内存。
答案 0 :(得分:3)
有几个问题:
realloc(string, (counter)*sizeof(char));
是错误的,您需要string = realloc(string, (counter)*sizeof(char));
,因为realloc
可能返回另一个地址。
呼叫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
中)得到了有效的指针。