【发布时间】:2014-12-19 07:57:41
【问题描述】:
作为健壮性和最佳实践,如果要访问指向任何数据类型的指针,我们应该在访问之前保护它不为 NULL...
例如:
int Var;
int *ptrToVar = &Var;
int main(void)
{
if (ptrToVar != NULL)
{
(*ptrToVar) = 6;
}
else
{
//do nothing
}
}
我的问题是:
在代码运行期间ptrToVar 是否可能是NULL?
如果是的话!那么什么可以使指针ptrToVar 在运行时成为NULL?!
【问题讨论】:
-
对于您发布的简单程序,它不会。对于大型程序,各种错误都会出现。
-
如果你将
NULL分配给一个指针,它当然是NULL。此外,未初始化的全局变量和局部静态变量将被初始化为零,这意味着它们将是NULL。此外,调试器会将所有数据初始化为零(即NULL用于指针),这可能会隐藏您访问未初始化指针的错误。 -
鉴于代码中没有函数调用,这里没有任何东西可以修改
ptrToVar。但是,如果您在其他文件中调用代码,因为ptrToVar是一个全局变量,您必须查看其他代码以查看它是否引用了ptrToVar。更阴险的是,*(&Var-1) = 0;或*(&Var+1) = 0;(两者都会调用未定义的行为)可能会破坏指针,因此您必须担心全局变量会修改它们的代码。尽可能避免使用全局变量的另一个原因。 -
如果有任何答案解决了您的问题,请考虑通过单击旁边的复选标记来接受它。这向更广泛的社区表明您找到了解决方案,并为回答者和您自己赢得了一些声誉。