#include <stdio.h>
#include <stdlib.h>
main()
{
int *p = (int *)malloc(sizeof(int));
int *q = (int *)realloc(p,sizeof(int));
*p = 3;
*q = 9;
if (p == q)
printf("%d %d", *p, *q);
}
当我运行它时,它在GCC中打印9 9。 有人可以解释这段代码的行为吗?
答案 0 :(得分:7)
严格遵守标准,您的程序表现出不确定的行为(C标准,7.22.3.5):
realloc
函数释放ptr
指向的旧对象,并返回指向新对象的指针,该指针的大小由size
。新对象的内容应与解除分配之前的旧对象的内容相同,直到新旧大小中的较小者为止。新对象中超出旧对象大小的任何字节都有不确定的值。
realloc
中涉及的两个对象不一样 - 分配了新对象,并且您知道其内容与旧内容相同,旧内容被销毁。您对p
的取消引用是对其生命周期内的对象的访问,这是未定义的。
realloc
可以移动内存区域,但不必移动内存区域。
在这种情况下,两个分配都具有相同的大小(sizeof(int)
)。 realloc
很可能意识到这一点,并且根本不会移动内存区域。
结果,p == q
。
PS:&#34;可能&#34;因为行为未定义。您的编译器可能只分析realloc
代码路径,并注意到程序可以使用的唯一合法方式是realloc
不移动指针,而是优化为q = p
。您需要调查生成的程序集才能真正找到答案。