【问题标题】:What happens when using realloc and memory is written to a new address?使用 realloc 并将内存写入新地址时会发生什么?
【发布时间】: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; 似乎很奇怪,因为它不能被双重取消引用。

标签: c arrays pointers


【解决方案1】:

你理解的问题不是realloc(),而是一般的指针和局部变量。

即使从函数返回后,array->items 是否也能正确分配给新值?

在您上面的代码中,它已正确分配。虽然指针指向某个地址,但指针本身是一个普通变量。

array->items 变成了一个悬空指针,因为它没有被正确地重新分配,因为一旦函数退出,对 void **items 的引用就被删除了?

没有。没有指针被删除。局部变量void **items 本身超出范围,但不是它所指向的。

考虑:

void foo(Array *a) {
    int sz = 23;
    a->size = sz;
}

a->size 在函数返回后会变成“悬空”吗?你的问题和这个一样。

【讨论】:

    【解决方案2】:

    首先要注意的是表达式:

    void **items = realloc(array->items, array->capacity);
    

    应该改成:

    void **items = realloc(array->items, (array->capacity) * sizeof(void *));
    

    其次,回答你的问题:

    即使从函数返回后,array->items 是否也能正确分配给新值?

    确实如此,因为您将一个指针(指向一个结构)传递给您的函数,因此该函数可以修改struct 成员items

    接下来,当你分配array->items = items;并且函数返回时,局部变量items会超出范围,但是请记住,分配给array->items的值是分配存储的内存地址持续时间,所以array->items 不是悬空指针,因为它指向的是有效内存。

    【讨论】:

      猜你喜欢
      • 2019-05-24
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      相关资源
      最近更新 更多