[英]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.