【发布时间】:2018-07-23 13:42:11
【问题描述】:
假设我有一个函数,它接受一个指向结构的指针,它的定义是这样的
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 返回一个新的内存地址,array->items 得到即使从函数返回后也正确分配给新值?
或者void **items 是在函数doubleArray 的本地范围内定义的事实是否意味着array->items 成为一个悬空指针,因为它没有正确重新分配,因为对void **items 的引用被删除了一次函数退出?
【问题讨论】:
-
@Abhineet - 不确定它是否重复。您发布的问题是关于
realloc的工作原理,而我的问题是关于函数中定义的指针引用发生了什么的扩展realloc的返回值被赋值给。如果我错了,请纠正我。 -
realloc无论如何都不起作用,因为传递的大小不正确。您已经传递了元素的数量并忽略了每个元素的大小。 -
@WeatherVane - 你介意详细说明一下吗?我并没有真正关注
-
所以我建议
void **items = realloc(array->items, array->capacity * sizeof *items);。然而,struct包含void **items;似乎很奇怪,因为它不能被双重取消引用。