#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()
函数后它应该返回一个新的内存地址吗?
答案 0 :(得分:7)
这是正确的行为。 (不违反任何规则)。
来自standard
realloc
函数返回指向新对象的指针(可能 具有与指向旧对象的指针相同的值,或空指针 如果无法分配新对象。
请注意上面部分中突出显示的可能。是的,它可能返回与旧的相同的值 - 它既不会说它总是新地址或旧地址。
正确使用它们。问题是,它会在realloc
的第二个参数中按照您的要求进行扩展或缩小。
但您使用malloc
和realloc
的方式是错误。
int *t = realloc(*p, 6*sizeof(int));
if(NULL == t){ /* Failure */
perror("realloc");
exit(EXIT_FAILURE);
}
*p = t;
同样适用于malloc
。 (提到这一点,因为这可能会使你免于许多不必要的错误观察)。
释放动态分配的内存。
答案 1 :(得分:5)
在调用realloc()函数后,它应该更改内存地址吗?
不一定。关于其行为的唯一要求是,如果操作成功则返回有效指针,否则返回空指针。
它用于实现此目标的策略(尽可能尝试扩展块或将数据移动到不同的块)是一个实现细节,它可能随时更改,恕不另行通知。