访问传递给realloc的指针

dev*_*ahm -3 c

#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);

}
Run Code Online (Sandbox Code Playgroud)

当我运行它时它在GCC中打印9 9.有人可以解释这段代码的行为吗?

Tre*_*ton 7

标准说什么?

严格遵循标准,您的程序表现出不确定的行为(C标准,7.22.3.5):

realloc函数释放指向的旧对象,ptr并返回指向具有指定大小的新对象的指针size.新对象的内容应与解除分配之前的旧对象的内容相同,直到新旧大小中的较小者为止.新对象中超出旧对象大小的任何字节都具有不确定的值.

涉及的两个对象realloc不一样 - 新的对象被分配,并且您知道其内容与旧内容相同,旧内容被销毁.您的解引用p是访问其生命周期之外的对象,这是未定义的.

在这里实践中发生了什么(可能)?

realloc 可以在必要时移动存储领域,但不具有移动存储区.

在这种情况下,两个分配都具有相同的大小(sizeof(int)).realloc很可能意识到这一点并且根本不会移动内存区域.

结果,p == q.

PS:"可能"因为行为未定义.您的编译器可能只是分析realloc代码路径,并注意到程序可以工作的唯一合法方式是realloc不移动指针,q = p而是优化.您需要调查生成的程序集才能真正找到答案.