什么是未初始化的指针变量?

rai*_*ain 1 c

我在接受采访时被问到这个问题.

如果有一个声明但未初始化的指针如下: int *ptr;

是否分配了默认值?或者它是一个空指针?此外,如果我们尝试使用此指针,会发生什么:

if(ptr) { //block of code }

if条件会通过吗?此外,这将在调试/发布版本上工作吗?

我试图在家里运行这个程序,发现if条件通过,如果我尝试打印像这样的ptr的值:

printf("%x %d", ptr, *ptr);

它打印一些随机值,但它不会使程序崩溃.这背后的解释是什么?

Oli*_*rth 9

如果它是一个全局变量(或static),它将被隐式初始化为NULL.否则,其值未定义.因此,该if语句的行为是未定义的(即,您不能对其可能做的事情做出任何假设).第二个示例的行为也未定义(并且可能导致分段错误).

未初始化的指针被认为是危险的; 想象一下这段代码的后果:

int *ptr;

...

*ptr = 42;  // Dereference pointer and trash somewhere random in memory
Run Code Online (Sandbox Code Playgroud)

但请注意,这可能不会崩溃; 它可能会默默地腐败事物.

因此,惯例是始终显式初始化它以指向有用的东西.如果那是不可能的(例如,你还没有指明的东西),你可以做的下一个最好的事情就是初始化它NULL.取消引用NULL指针会在大多数平台上引发分段错误,这至少可以帮助您追踪错误.