【问题标题】:Is it possible for an initialized pointer to be NULL in during the run time of code?在代码运行时,初始化的指针是否可能为 NULL?
【发布时间】: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;(两者都会调用未定义的行为)可能会破坏指针,因此您必须担心全局变量会修改它们的代码。尽可能避免使用全局变量的另一个原因。
  • 如果有任何答案解决了您的问题,请考虑通过单击旁边的复选标记来接受它。这向更广泛的社区表明您找到了解决方案,并为回答者和您自己赢得了一些声誉。

标签: c pointers memory null


【解决方案1】:

全局变量存储在数据段中。如果全局变量未初始化,它们将被初始化为 0 。所以它只是初始化为 0。你有一个指针 ptrToVar 指向这个变量。因此,除非您的代码中有一些未分配的内存访问或 UB,否则此指针永远不会为 NULL。

您可以尝试打印指针指向的地址,它不能为 NULL。(在定义的行为中)。

如果我们只考虑您发布的代码,指针ptrToVar 不为NULL。

【讨论】:

    【解决方案2】:

    如果您的程序有未定义的行为,它只能为 NULL。在正确的 C 程序中,局部变量永远不会为 NULL。因此不需要检查。

    6.3.2.3 指针

    p2:值为 0 的整型常量表达式,或者这种类型的表达式 void *,称为空指针常量。 如果一个空指针常量被转换为一个 指针类型,得到的指针,称为空指针,保证比较不相等 指向任何对象或函数的指针。

    如果你的程序有错误,使用 assert() 来定位它们,它会打印一个警告并立即中止。

    【讨论】:

      【解决方案3】:

      在您的代码中,int *ptrToVar = &Var ptrTovar 的地址为 var。 因此它具有 var 的地址,ptrTovar 不会为 NULL。 如果 ptrTovar 是全局变量,或者您已将 ptrTovar 初始化为 NULL,则地址将为 NULL。 如果你打印printf("address:%d\n",ptrTovar),它会打印一些地址,所以它在你的代码中不是NULL。

      【讨论】:

        猜你喜欢
        • 2017-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多