Realloc()没有改变已经分配的内存的内存地址?

时间:2018-01-19 17:09:30

标签: c

#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()函数后它应该返回一个新的内存地址吗?

2 个答案:

答案 0 :(得分:7)

这是正确的行为。 (不违反任何规则)。

来自standard

  

realloc函数返回指向新对象的指针(可能   具有与指向旧对象的指针相同的值,或空指针   如果无法分配新对象。

请注意上面部分中突出显示的可能。是的,它可能返回与旧的相同的值 - 它既不会说它总是新地址或旧地址。

正确使用它们。问题是,它会在realloc的第二个参数中按照您的要求进行扩展或缩小。

但您使用mallocrealloc的方式是错误

int *t = realloc(*p, 6*sizeof(int));
if(NULL == t){ /* Failure */
    perror("realloc");
    exit(EXIT_FAILURE);
}
*p = t;

同样适用于malloc。 (提到这一点,因为这可能会使你免于许多不必要的错误观察)。

完成后,

释放动态分配的内存。

答案 1 :(得分:5)

  

在调用realloc()函数后,它应该更改内存地址吗?

不一定。关于其行为的唯一要求是,如果操作成功则返回有效指针,否则返回空指针。

它用于实现此目标的策略(尽可能尝试扩展块或将数据移动到不同的块)是一个实现细节,它可能随时更改,恕不另行通知。