【问题标题】:C static variables and initializationC 静态变量和初始化
【发布时间】:2010-04-11 13:44:48
【问题描述】:

如果我在这段代码中有一个全局静态变量 x

 #include <stdio.h>
 #include <stdio.h>

 static int x;

 int main(void)
 {

 DO SOMETHING WITH x HERE

 x++;

 }

如果我选择将 x 初始化为一个值,如

static int x = 0;  

在输入“main”之前?

在我没有为 x 赋值的第一种情况下,编译器是否隐含地知道 x 将被设置为零,因为它是一个静态变量?我听说我们可以使用静态变量来做到这一点。

非常感谢...

【问题讨论】:

    标签: c static initialization


    【解决方案1】:

    具有显式初始化的静态变量始终初始化为零(或空指针,具体取决于类型)。 C 标准 §6.7.8/10 对此进行了描述。但是明确地将其设置为 0 可以帮助其他人无需怀疑相同的问题:)。

    【讨论】:

    • 非常感谢您的确认。
    • 如果是浮点数,则为 0.0,如果是指针,则为 NULL。 (它们在内存中都有相同的基本值。)
    • 您可能会考虑注意到 C99 标准指定了这一点,找到此答案的人可能仍处于必须使用旧编译器的位置。
    • @Tim Post:C90 也指定了静态分配变量的这种初始化行为,但是我听说有一些旧的编译器不遵循这个规则。
    • @Michael Burr:我可以确认我每天使用的 C 编译器不遵循该规则......希望在未来的版本中能够修复。
    【解决方案2】:

    有一个很好的答案here

    只是一个简短的摘录:

    首先在 ISO C (ANSI C) 中,所有的静态变量和全局变量都必须在程序启动之前进行初始化。如果程序员没有明确地这样做,那么编译器必须将它们设置为零。如果编译器不这样做,则它不遵循 ISO C。但是,变量的具体初始化方式并未由标准指定。

    【讨论】:

    • 感谢您的链接。从那里我读到“这些问题的唯一解决方案是编写代码,以便在使用变量之前在运行时完成所有静态/全局初始化”。回到我的情况,那么我可以在使用 x 之前在我的“main”中添加“static int x”行吗?这是更好的编程实践吗?
    • @yCalleecharan: 如果 x 只被 main 使用,那么你应该在 main 中声明它。如果您将其声明为自动,它将始终在堆栈中。如果将其声明为静态,则不会浪费任何堆栈空间。
    • 这很有趣。我很想知道哪些 C 语言书籍讨论了这些问题。谢谢。
    【解决方案3】:

    static 变量会自动初始化为零(即,就好像您已将零分配给它们,导致浮点数和指针分别变为 0.0 和 NULL,即使这些值的内部表示并非所有位都为零)。

    【讨论】:

    • 谢谢。 “即使这些值的内部表示并非全为零”是什么意思?你能澄清一下吗?
    • @yCallee: 如果某些架构的 NULL 在 0x1000,那么指针将被初始化为 0x1000 而不是 0。
    • @yCalleecharan:C 编译器将赋值为零的整数常量分配给指针作为创建空指针,但该机器的实际空指针值可能不为零。所以指针实际上可能不会被初始化为内存中的所有位为零在给定的机器上,而是好像你已经写了= 0
    • 它有点高级,但我理解:)。谢谢。
    【解决方案4】:

    静态变量总是隐式初始化为零,因此将 x 显式初始化为零没有区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2010-12-22
      相关资源
      最近更新 更多