让我们说我有一个接受指向结构的指针的函数,这个函数定义如下
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会返回一个新的内存地址,因为前一个缓冲区已被覆盖,{{ 1}}即使从函数返回后也正确分配给新值?
或array->items
在函数void **items
的局部范围内定义的事实意味着doubleArray
成为悬空指针,因为它未正确重新分配,因为它引用了函数退出后会删除array->items
吗?
答案 0 :(得分:3)
您的理解问题与realloc()
无关,它与指针和局部变量有关。
即使从函数返回后,array->项也会正确分配给新值吗?
在上面的代码中,它已正确分配。虽然指针指向某个地址,但指针本身是一个普通变量。
array->项目成为悬空指针,因为它未正确重新分配,因为一旦函数退出,就会删除对void **项的引用?
没有。没有指针被删除。局部变量void **items
本身超出范围,但不是它指向的范围。
考虑:
void foo(Array *a) {
int sz = 23;
a->size = sz;
}
a->size
会变成"悬空"函数返回后?你的问题和这个问题是一样的。
答案 1 :(得分:0)
您应该注意的第一件事是表达式:
void **items = realloc(array->items, array->capacity);
应该改为:
void **items = realloc(array->items, (array->capacity) * sizeof(void *));
其次,回答你的问题:
即使从函数返回后,array->项也会正确分配给新值吗?
确实如此,因为您将指针(到结构)传递给函数,因此该函数可以修改struct
成员items
。
接下来,当您分配array->items = items;
并且函数返回时,局部变量items
超出范围,但请记住,其值已分配给array->items
,是地址已分配存储持续时间的内存,因此array->items
不是悬空指针,因为它指向有效内存。