当使用realloc并将内存写入新地址时会发生什么情况?
假设我有一个函数,它接受指向结构的指针,定义如下当使用realloc并将内存写入新地址时会发生什么情况?,c,arrays,pointers,C,Arrays,Pointers,假设我有一个函数,它接受指向结构的指针,定义如下 typedef struct Array { int capacity; int size; void **items; } Array; 此函数将重新锁定array->items的内存以增加大小 函数如下所示 void doubleArray(Array *array) { array->capacity *= 2; void **items = realloc(array->items,
typedef struct Array {
int capacity;
int size;
void **items;
} Array;
此函数将重新锁定array->items
的内存以增加大小
函数如下所示
void doubleArray(Array *array) {
array->capacity *= 2;
void **items = realloc(array->items, array->capacity);
if(items == NULL) {
exit(1);
}
array->items = items;
}
我很难理解的是,如果我将void**items
分配给realloc的结果,和realloc返回一个新的内存地址,因为先前的缓冲区已被覆盖,那么数组->items
是否在从函数返回后也正确分配给新值
或者,
void**items
是在函数doubleArray
的本地范围内定义的,这是否意味着array->items
会成为一个悬空指针,因为函数退出后,对void**items
的引用被删除,所以它没有正确地重新分配 理解的问题不在于realloc()
,而在于指针和局部变量
array->items是否在从函数返回后正确分配给新值
在上面的代码中,它已正确分配。虽然指针指向某个地址,但指针本身是一个普通变量
数组->项目成为悬空指针,因为它没有正确重新分配,因为一旦函数退出,对void**项目的引用将被删除
否。未删除任何指针。局部变量void**items
本身超出范围,但不是它所指向的
考虑:
void foo(Array *a) {
int sz = 23;
a->size = sz;
}
函数返回后,
a->size
是否会变为“悬空”?您的问题与此相同。您应该注意的第一件事是,表达式:
void **items = realloc(array->items, array->capacity);
可能应改为:
void **items = realloc(array->items, (array->capacity) * sizeof(void *));
第二,回答你的问题:
array->items是否在从函数返回后正确分配给新值
确实如此,因为您将指针(指向结构)传递给函数,因此函数能够修改struct
成员项
接下来,当您分配array->items=items时
函数返回时,局部变量items
超出范围,但请记住,它已分配给array->items
的值是已分配存储持续时间的内存地址,因此array->items
不是一个悬空指针,因为它指向的是有效内存。可能是@Abhineet的重复项-不确定它是否重复。。您发布的问题是关于realloc
如何工作的,而我的问题是关于realloc
返回值分配给的函数中定义的指针引用发生了什么情况的扩展。如果我错了,请纠正我。realloc
无论如何都无法工作,因为传递的大小不正确。您已经传递了元素的数量,而忽略了每个元素的大小。@WeatherVane-您介意详细说明一下吗?我不是真的在跟随,所以我建议void**items=realloc(数组->项目,数组->容量*大小*项目)代码>。然而,struct
包含void**项似乎很奇怪代码>因为这不能双重取消引用。