[英]Realloc() not changing memory address of already allocated memory?
#include <stdio.h>
#include <stdlib.h>
void f(int **p) {
printf("*p: %ptr\n", *p);
*p = realloc(*p, 6*sizeof(int));
printf("*p: %ptr\n", *p);
}
int main() {
int *a = malloc(3*sizeof(int));
printf("a before f(): %ptr", a);
f(&a);
printf("new a address after f(): %ptr\n", a);
return 0;
}
當我運行它時,所有內存地址都是相同的。 我錯誤地認為在地址上調用realloc()
函數后它應該返回一個新的內存地址嗎?
那是正確的行為。 (不違反任何規則)。
從標准
realloc
函數返回指向新對象的指針( 可能與指向舊對象的指針具有相同的值),如果無法分配新對象,則返回空指針。
請注意上一節中突出顯示的可能 。 是的,它可能返回與舊的相同的值 - 它既不會說它總是新地址或舊地址。
只需正確使用它們。 事情是,它將按照你在realloc
的第二個paaremeter中的要求進行擴展或縮小。
但是你使用malloc
和realloc
是錯誤的 。
int *t = realloc(*p, 6*sizeof(int));
if(NULL == t){ /* Failure */
perror("realloc");
exit(EXIT_FAILURE);
}
*p = t;
同樣適用於malloc
。 (提到這一點,因為這可能會使您免於許多不必要的錯誤觀察)。
完成后,釋放動態分配的內存。
調用realloc()函數后,它應該更改內存地址?
不必要。 關於其行為的唯一要求是在操作成功時返回有效指針,否則返回空指針。
它用於實現此目標的策略(盡可能嘗試擴展塊或將數據移動到不同的塊)是一個實現細節,它可能隨時更改,恕不另行通知。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.