繁体   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