提问人:Subham Jain 提问时间:3/15/2023 最后编辑:Subham Jain 更新时间:3/15/2023 访问量:59
malloc:对象 0x147606ac0 的 *** 错误:未分配 realloc 的指针
malloc: *** error for object 0x147606ac0: pointer being realloc'd was not allocated
问:
我正在尝试在 C 语言中研究动态内存。我遇到了一个奇怪的问题,我得到了一个错误。我正在尝试根据变量中的值重新分配内存块,该值在每次执行循环时都会递增。如果我尝试在函数中执行 realloc,它会抛出错误,但如果我在定义变量的同一范围内执行,它就可以正常工作。malloc: *** error for object 0x147606ac0: pointer being realloc'd was not allocated
size
struct client_detail
{
int id, fd;
};
struct group_member
{
int id, fd, isAdmin;
};
struct group_detail
{
int id, isBroadcastOnly, size;
struct group_member members[5];
};
//`client_detail`, `group_member`, and `group_detail` are the structures required.
int main()
{
struct group_detail *group_details = malloc(0 * sizeof(*group_details));
struct client_detail *client_details = malloc(1 * sizeof(*client_details));
int size = 0;
int j = 0;
while(j < 100){
client_details = realloc(client_details, (size + 1) * sizeof(client_details));
j++;
size++;
}
return 0;
}
上面的一段代码工作得很好,但是如果我把我正在做的事情放在一个函数中,循环会在第 11 次迭代时终止,并出现错误。malloc: *** error for object 0x147606ac0: pointer being realloc'd was not allocated
下面是带有抛出错误的函数的代码:-
void func(struct client_detail *client_details,int *size){
client_details = realloc(client_details, (*size + 1) * sizeof(*client_details));
*size = *size + 1;
}
int main()
{
struct group_detail *group_details = malloc(0 * sizeof(*group_details));
struct client_detail *client_details = malloc(1 * sizeof(*client_details));
int size = 0;
int j = 0;
while(j < 100){
func(client_details,&size);
j++;
}
return 0;
}
我在macOS上运行上述代码。
我最初是以模块化的方式做的,但并没有奏效。我尝试了非模块化方式(无功能),它工作正常。我希望它即使在功能上也能正常工作。我无法弄清楚为什么它不起作用。
希望有人能帮忙。
提前致谢。
答:
该函数不会更新调用方的值 client_details,您需要再增加一个指针级别:
void func(struct client_detail **client_details,int *size){
*client_details = realloc(*client_details, (*size + 1) * sizeof(**client_details));
*size = *size + 1;
}
int main()
{
struct group_detail *group_details = malloc(0 * sizeof(*group_details));
struct client_detail *client_details = malloc(1 * sizeof(*client_details));
int size = 0;
int j = 0;
while(j < 100){
func(&client_details,&size);
j++;
}
return 0;
}
与大小类似,如果您只想要该值,则类型为 .更改函数内部的变量不会对调用方产生任何影响。您想要更改它,因此您创建一个指向 int 的指针并取消引用它以读取/写入该值。int
int size
int *
通过值获取client_details指针,更改该指针不会对调用方的变量产生影响。您需要添加一个指向它的指针,类似于对大小所做的指针。void func(struct client_detail *client_details,int *size){
评论