如果我在C程序中使用未初始化的全局变量,会发生什么?是不确定的行为?
#include <stdio.h>
int i;
int main()
{
while(i < 5)
{
i++;
}
printf("%d\n", i);
return 0;
}
答案 0 :(得分:6)
是不确定的行为?
没有。
会发生什么?
i
具有静态存储持续时间(文件范围)。它默认初始化为零。
答案 1 :(得分:3)
TL; DR 不,你很好。
但是不要相信我的话,让我们再看一下为什么部分,跟随权威人士。
首先,让我们看一下标识符(变量)的范围。
注意:所有强调我的
根据C11
,章节§6.2.1
如果是声明标识符的声明符或类型说明符 出现在任何块或参数列表之外,标识符具有文件范围,其中 终止于翻译单元的末尾。
然后,从章节§6.2.2
[...]如果 对象标识符的声明具有文件范围,没有存储类说明符, 它的联系是外部的。
,最后,对于存储类,章节§6.2.4,
一个对象,其标识符声明为,没有存储类说明符
_Thread_local
,可以是外部或内部链接,也可以是存储类 说明符static
,具有静态存储时间。
因此,您提到的全局变量具有静态存储持续时间。
现在,你说,它没有明确初始化,让我们看看规范对此有何看法。
引用章节§6.7.9/ P10,
如果未初始化具有静态或线程存储持续时间的对象 明确地,然后:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员, 并且任何填充都被初始化为零位;
- 如果是联合,则根据这些初始化(递归)第一个命名成员 规则,任何填充都初始化为零位;
因此,即使没有显式初始化,变量也有定义的值,因此使用该变量 read 是完全可以的。 此处没有未定义的行为。