我在接受采访时被问到这个问题。
如果有一个声明但未初始化的指针如下:
int *ptr;
是否分配了默认值?或者它是一个空指针?此外,如果我们尝试使用此指针,会发生什么:
if(ptr)
{
//block of code
}
if条件会通过吗?此外,这是否适用于调试/发布版本?
我试图在家里运行这个程序,发现if
条件通过了,如果我试图像这样打印ptr的值:
printf("%x %d", ptr, *ptr);
它打印一些随机值,但它不会使程序崩溃。这背后的解释是什么?
答案 0 :(得分:9)
如果它是全局变量(或static
),它将被隐式初始化为NULL
。否则,其值未定义。因此,if
语句的行为是未定义的(即,您不能对其可能做的事情做出任何假设)。第二个示例的行为也未定义(并且可能导致分段错误)。
未初始化的指针被认为是危险的;想象一下这段代码的后果:
int *ptr;
...
*ptr = 42; // Dereference pointer and trash somewhere random in memory
但请注意,这可能不会崩溃;它可能会默默地腐败。
因此,惯例是始终显式初始化它以指向有用的东西。如果那是不可能的(例如,你还没有指点),那么你可以做的下一个最好的事情是将其初始化为NULL
。取消引用NULL
指针会在大多数平台上引发分段错误,这至少可以帮助您追踪错误。
答案 1 :(得分:4)
未初始化的指针有利于安全漏洞,并可能有助于播种随机数生成器。
如果指针已初始化为if
(0),则NULL
条件将仅跳过代码块。
因为默认情况下初始化值未定义,所以初始化为NULL
始终是一种好习惯。
你的printf
语句只是说明它默认为NULL以外的值,在这种情况下它是一个可以被解除引用的有效内存区域。
答案 2 :(得分:2)
未初始化的指针变量有什么用处?
效率。如果C自动初始化指向NULL
的指针,则会浪费整个CPU指令(如果变量必须存储在主存储器而不是寄存器中,则可能更多),这对C的设计者来说是不可接受的。你认为程序员现在想要牺牲宝贵的纳秒运行时间来节省几个小时的调试时间吗?