簡體   English   中英

Realloc()沒有改變已經分配的內存的內存地址?

[英]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中的要求進行擴展或縮小。

但是你使用mallocrealloc錯誤的

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.

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