例如,我们有以下简单代码:
#include "stdio.h"
int main() {
int* pointer_to_check;
printf("%x\n", pointer_to_check);
return 0;
}
使用gcc,我们将在输出时得到零(对我而言,正常行为,因为指针与内存无关),但是clang为我们提供了一个真实的地址,可以在没有“分段错误”的情况下访问。
我有两个问题:
答案 0 :(得分:6)
pointer_to_check
未初始化。它指向一些"随机"位置。
访问未初始化的变量会导致Undefined Behavior,这意味着任何事情都可能发生。
此外,应使用%p
格式说明符打印指针。
使用gcc代码,我们将在输出时得到零
任何东西都可以作为输出。它是未定义的。你不应该依赖这种行为。
答案 1 :(得分:3)
这是未定义的行为。
当您声明指针时,指针不会被初始化,因此它们可以指向任何位置。 0
,0xDEADBEEF
或其他任何内容都是“有效”的表示形式。
如果希望将指针初始化为null,请明确地执行:
int* pointer_to_check = nullptr;