不同的clang和gcc行为与指针

时间:2015-06-10 12:35:51

标签: c++ c gcc clang

例如,我们有以下简单代码:

#include "stdio.h"   

int main() {   
  int* pointer_to_check;
  printf("%x\n", pointer_to_check);
  return 0;
}

使用gcc,我们将在输出时得到零(对我而言,正常行为,因为指针与内存无关),但是clang为我们提供了一个真实的地址,可以在没有“分段错误”的情况下访问。

我有两个问题:

  1. 根据C标准(和C ++)的正常行为是什么?
  2. 为什么会这样?

2 个答案:

答案 0 :(得分:6)

要检查的

pointer_to_check未初始化。它指向一些"随机"位置。

访问未初始化的变量会导致Undefined Behavior,这意味着任何事情都可能发生。

此外,应使用%p格式说明符打印指针。

  

使用gcc代码,我们将在输出时得到零

任何东西都可以作为输出。它是未定义的。你不应该依赖这种行为。

答案 1 :(得分:3)

这是未定义的行为。

当您声明指针时,指针不会被初始化,因此它们可以指向任何位置。 00xDEADBEEF或其他任何内容都是“有效”的表示形式。

如果希望将指针初始化为null,请明确地执行:

int* pointer_to_check = nullptr;