【问题标题】:Simple Way to Check If Primitive is Uninitialized?检查基元是否未初始化的简单方法?
【发布时间】:2011-01-10 10:02:17
【问题描述】:

据我了解,在 C 中,int 和 float 等原语在首次声明时被初始化为 0。如果声明的结构包含原语,情况也是如此。我很难找到一种简单的方法来检查基元是否未初始化。

例如,假设我有一个在头文件中声明的 int 类型的实例变量。我需要在我的实现代码中使用这个变量,知道这个值是否已经初始化对我来说很重要。检查零并不是一个真正的选择,因为如果该值确实应该为零,那么我已经重新初始化了一个已经更改的值。检查 NULL 也不起作用,因为它不是指针。

我想出的唯一解决方案是将第一段可执行代码中的变量初始化为某个我知道永远不会与程序的其余部分相关的值。例如,如果该值永远不应低于零,那么我将其初始化为 -1 以知道它尚未初始化。不过,这看起来确实很麻烦,并且如果可以分配变量的值的范围发生变化,可能会导致问题。

对这类问题有什么有趣的建议吗?提前致谢!

【问题讨论】:

  • 使用未初始化的变量就是UB。如果您通过开关 -Wall (gcc),您可以跟踪每个未初始化的变量。 gcc 将报告如下内容:ddd.c:8: warning: ‘i’ is used uninitialized in this function

标签: c methods conventions


【解决方案1】:

你的理解不正确。无论是int 还是float,局部变量都未初始化。

只有static 变量被初始化为零。您应该在使用前初始化所有内容。即使你觉得你的实现初始化了变量,你也不应该依赖它。该标准不保证任何事情。使用未初始化的变量是一种未定义的行为。

【讨论】:

  • 感谢您纠正我,但这并不能回答我的问题。如果在稍后的程序之前不会分配实例变量的值,我究竟应该将我的实例变量初始化为什么?如何检查它是在其他程序中初始化还是未初始化?
  • @Zanneth:您根本不应该检查变量本身。您应该始终在使用前初始化变量。如果由于某种原因您必须依赖某些延迟初始化机制,您应该保留一个标志(在同一个变量中,如果它超出可接受值的范围,则使用 -1 之类的值,或者使用单独的布尔标志跟踪变量的初始化)。
【解决方案2】:

只有全局原语、指针和数据结构被初始化为零;局部变量或malloc()'d 内存不是。

【讨论】:

    【解决方案3】:

    初始化具有静态存储持续时间的对象的零与您的代码明确设置的零之间没有区别。零就是零。

    你所能做的就是用一个非零的无效数字显式初始化它(在定义它的.c文件中):

    foo.h:

    extern double foo;
    

    foo.c:

    double foo = NAN;
    

    或者,或者,伴随一个标志变量,指示它是否已被初始化:

    foo.h:

    extern double foo;
    extern int foo_initialised;
    

    foo.c:

    double foo;
    int foo_initialised;
    

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2021-11-21
      • 2020-10-07
      相关资源
      最近更新 更多