使用realloc和内存时会发生什么情况写入新地址?

时间:2018-02-13 08:37:24

标签: 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, array->capacity);
    if(items == NULL) {
        exit(1);
    }
    array->items = items;
}

我很难理解的是,如果我将void **items分配给realloc的结果,和realloc会返回一个新的内存地址,因为前一个缓冲区已被覆盖,{{ 1}}即使从函数返回后也正确分配给新值?

array->items在函数void **items的局部范围内定义的事实意味着doubleArray成为悬空指针,因为它未正确重新分配,因为它引用了函数退出后会删除array->items吗?

2 个答案:

答案 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不是悬空指针,因为它指向有效内存。