当使用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**项似乎很奇怪因为这不能双重取消引用。