错误:";指针为realloc';“未分配d”;在macOS上,但在Windows上尝试两次realloc时仍有效
我试图实现一个连接两个字符串的函数,但我一直得到相同的错误。 “未分配要重新分配的指针” 当我在windows机器上编译相同的代码时,它起作用了,是不是我遗漏了什么? 下面的代码基本上就是我要做的。 主要内容: createString:错误:";指针为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)
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;