我在接受采访时被问到这个问题.
如果有一个声明但未初始化的指针如下:
int *ptr;
是否分配了默认值?或者它是一个空指针?此外,如果我们尝试使用此指针,会发生什么:
if(ptr)
{
//block of code
}
if条件会通过吗?此外,这将在调试/发布版本上工作吗?
我试图在家里运行这个程序,发现if条件通过,如果我尝试打印像这样的ptr的值:
printf("%x %d", ptr, *ptr);
它打印一些随机值,但它不会使程序崩溃.这背后的解释是什么?
如果它是一个全局变量(或static),它将被隐式初始化为NULL.否则,其值未定义.因此,该if语句的行为是未定义的(即,您不能对其可能做的事情做出任何假设).第二个示例的行为也未定义(并且可能导致分段错误).
未初始化的指针被认为是危险的; 想象一下这段代码的后果:
int *ptr;
...
*ptr = 42; // Dereference pointer and trash somewhere random in memory
Run Code Online (Sandbox Code Playgroud)
但请注意,这可能不会崩溃; 它可能会默默地腐败事物.
因此,惯例是始终显式初始化它以指向有用的东西.如果那是不可能的(例如,你还没有指明的东西),你可以做的下一个最好的事情就是初始化它NULL.取消引用NULL指针会在大多数平台上引发分段错误,这至少可以帮助您追踪错误.