C语言中的静态变量和初始化

4
如果我有一个全局静态变量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设置为零,因为它是一个静态变量?我听说我们可以使用静态变量来实现这一点。

非常感谢...

4个回答

8

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


如果它们是浮点数,则返回它们的值,否则返回0.0,如果它们是指针,则返回NULL。(它们在内存中具有相同的基本值。) - Donal Fellows
你可能需要注意到C99标准规定了这一点,因为有些人在查找答案时仍可能处于不得不绕过旧编译器的位置。 - Tim Post
1
@Tim Post:C90也指定了静态分配变量的初始化行为,但我听说有一些旧编译器不遵循这个规则。 - Michael Burr
@Michael Burr:我可以确认,我每天使用的一个C编译器并没有遵循这个规则...希望在未来的版本中能够修复。 - tomlogic
@tomlogic:如果供应商到现在还没有修复它,我会对此不抱太大希望...但是,从你发布的一个问题中我看到你已经在增强编译器的运行时库——自己修复静态初始化错误可能并不太难。通常只需要一个小循环来清零特定的段/块(或一组段),足够早地在运行时初始化中执行即可。它可能需要用汇编语言编写,但唯一接近棘手的部分是确定要清除的范围并使其在适当的时间运行。 - Michael Burr
显示剩余2条评论

5
这里有一个不错的答案,关于嵌入式C中静态变量的初始化:链接
首先,在ISO C(ANSI C)中,所有静态和全局变量在程序启动之前必须进行初始化。如果程序员没有明确地进行这个操作,那么编译器必须将它们设置为零。如果编译器没有这样做,它就不符合ISO C标准。然而,变量的具体初始化方式未在标准中指定。

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

3

static变量会自动初始化为零(即使内部表示不是所有位都为零,也会导致浮点数和指针分别变为0.0和NULL)。


谢谢。“即使这些值的内部表示并不全是零位”,你的意思是什么?你能否请澄清一下? - yCalleecharan
@yCallee:如果某个架构的NULL值在0x1000,那么指针将被初始化为0x1000而不是0。 - kennytm
@yCalleecharan:C 编译器 将把一个整数常量赋值为零的指针视为创建一个空指针,但该机器的实际空指针值可能不为零。因此,在给定的机器上,指针在内存中实际上可能并没有初始化为所有位都是零,而是好像你已经写了 = 0 - Arkku
有点高级,但我理解了:)。谢谢。 - yCalleecharan

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接