Error :"pointer being realloc'd was not allocated" on macOS but works on Windows when trying to realloc twice
Error :"pointer being realloc'd was not allocated" on macOS but works on Windows when trying to realloc twice
我正在尝试实现一个连接两个字符串的函数,但我总是遇到同样的错误。
"pointer being realloc'd was not allocated"
当我在 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
可能return一个不同的地址.
调用createString(string, length);
不会修改string
如果您想要更准确的答案,您需要告诉我们确切 createString
应该做什么。在您的代码中,没有尝试连接两个字符串。
如果你 realloc
一些内存,指向原始内存的指针将变得无效(除非 realloc
失败并且 returned NULL
)。所以在同一个指针上调用 realloc
两次确实应该不起作用(如果第一次没有 return NULL
)。
让我们按执行顺序来解决这个问题。
fflush(stdin);
是 undefined behaviour。如果你真的需要清除标准输入中的所有内容,你必须找到另一种方法(例如循环)。有 compilers/systems 具有定义的实现,但我不会指望它。
string++;
是多余的,因为您在循环后覆盖 string
。
realloc(string, (counter)*sizeof(char));
应该是
char *temp = realloc(string, (counter)*sizeof(char));
if (temp != NULL)
string = temp;
通过这种方式您可以获得新 string
所在的指针,但我建议您阅读 realloc
的参考资料。从本质上讲,您不知道它是否已被移动,并且从那时起旧地址可能无效。所以取消引用它也是未定义的行为。
在此之后,您必须 return string
的新地址或将指针的地址传递给您的函数。
第二个 realloc
重复同样的问题。您只知道您的第一个电话是错误的,因为第二个电话注意到您没有有效数据,您认为 string
.
关于您的评论:无法使用 realloc
并确保重新分配的内存与以前相同。
查看其他人对您做错了什么的回答。但是,错误消息意味着在 MacOS 上,createString
中的 realloc
释放了原始 string
并分配了一个新的,现在 main
中的 realloc
尝试 realloc
一个不再有效(已分配)的指针。在 Windows 上,内存未在 createString
中释放,因此 realloc
的第二次调用(在 main
中)被赋予一个有效指针。
我正在尝试实现一个连接两个字符串的函数,但我总是遇到同样的错误。 "pointer being realloc'd was not allocated" 当我在 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
可能return一个不同的地址.调用
createString(string, length);
不会修改string
如果您想要更准确的答案,您需要告诉我们确切 createString
应该做什么。在您的代码中,没有尝试连接两个字符串。
如果你 realloc
一些内存,指向原始内存的指针将变得无效(除非 realloc
失败并且 returned NULL
)。所以在同一个指针上调用 realloc
两次确实应该不起作用(如果第一次没有 return NULL
)。
让我们按执行顺序来解决这个问题。
fflush(stdin);
是 undefined behaviour。如果你真的需要清除标准输入中的所有内容,你必须找到另一种方法(例如循环)。有 compilers/systems 具有定义的实现,但我不会指望它。
string++;
是多余的,因为您在循环后覆盖 string
。
realloc(string, (counter)*sizeof(char));
应该是
char *temp = realloc(string, (counter)*sizeof(char));
if (temp != NULL)
string = temp;
通过这种方式您可以获得新 string
所在的指针,但我建议您阅读 realloc
的参考资料。从本质上讲,您不知道它是否已被移动,并且从那时起旧地址可能无效。所以取消引用它也是未定义的行为。
在此之后,您必须 return string
的新地址或将指针的地址传递给您的函数。
第二个 realloc
重复同样的问题。您只知道您的第一个电话是错误的,因为第二个电话注意到您没有有效数据,您认为 string
.
关于您的评论:无法使用 realloc
并确保重新分配的内存与以前相同。
查看其他人对您做错了什么的回答。但是,错误消息意味着在 MacOS 上,createString
中的 realloc
释放了原始 string
并分配了一个新的,现在 main
中的 realloc
尝试 realloc
一个不再有效(已分配)的指针。在 Windows 上,内存未在 createString
中释放,因此 realloc
的第二次调用(在 main
中)被赋予一个有效指针。