簡體   English   中英

使用realloc並將內存寫入新地址時會發生什么?

[英]What happens when using realloc and memory is written to a new address?

假設我有一個函數,它接受指向結構的指針,該結構的定義如下

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;
}

我很難理解的是,如果我為realloc的結果分配void **items並且由於先前的緩沖區已被覆蓋 ,則realloc返回新的內存地址 ,即使在之后, array->items也會正確分配給新值從函數返回?

或者在函數doubleArray的局部范圍內定義void **items的事實doubleArray意味着array->items變成了懸空指針,因為未正確重新分配它,因為一旦函數刪除了對void **items的引用,退出?

您的理解問題與realloc()無關,它通常與指針和局部變量有關。

即使從函數返回后,array-> items是否仍被正確分配給新值?

在上面的代碼中,它已正確分配。 盡管指針指向某個地址,但指針本身是一個普通變量。

array-> items變成了一個懸空指針,因為它沒有正確地重新分配,因為一旦函數退出,對void ** items的引用就會被刪除?

否。沒有指針被刪除。 局部變量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成員items的能力。

接下來,當您分配array->items = items; 函數返回后,局部變量items超出了范圍,但請記住,已將其分配給array->items是已分配存儲持續時間的內存地址,因此array->items並不是一個懸空指針因為它指向有效的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM