访问传递给realloc的指针

时间:2017-11-10 12:48:24

标签: 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);

}

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

1 个答案:

答案 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。您需要调查生成的程序集才能真正找到答案。