使用未初始化的全局变量(用于读取和写入)可以吗?
问题描述:
如果我在C程序中使用未初始化的全局变量,会发生什么情况?它是不确定的行为?使用未初始化的全局变量(用于读取和写入)可以吗?
#include <stdio.h>
int i;
int main()
{
while(i < 5)
{
i++;
}
printf("%d\n", i);
return 0;
}
答
TL; DR不,你没事。
但是不要拿我的话来说吧,让我们再看看更多关于为什么部分,继权威消息。
首先,让我们看看标识符(变量)的范围。
注:所有重点矿山
作为每C11
,章§6.2.1
如果声明了标识符 的声明符或类型说明符出现任何块的外部或参数列表中,标识符的文件范围为,其中 终止于翻译单元的末尾。
然后,从章§6.2.2
[...]如果 的标识符的某个对象的声明有文件范围和没有存储类说明, 其连接是外部。
,最后,对于存储类,章第6.2.4节,
其标识符被声明而不存储类说明
_Thread_local
,并且用外部或内部联动的对象或与存储级别 说明符static
,具有静态存储持续时间。
因此,您提到的全局变量具有静态存储持续时间。
现在,你说,它没有明确初始化,让我们看看规范有什么要说的。
引用章节§6.7。9/P10,
如果具有静态或线程存储持续时间的对象没有初始化 明确,然后:
- 如果它有指针类型,它被初始化为空指针;
- 如果它有算术类型,它被初始化为(正或无符号)零;
- 如果它是一个聚合,每个成员根据这些规则初始化(递归), 和任何填充初始化为零位;
- 如果它是一个联合,根据这些 规则初始化第一个命名成员(递归),并且任何填充都初始化为零位;
所以,变量具有定义的值即使没有明确的初始化,所以使用该变量阅读是完全确定。 这里没有未定义的行为。
答
它是不确定的行为?
会发生什么号?
i
具有静态存储持续时间(文件范围)。它会默认初始化为零。
如果没有显式的初始化,全局变量将被初始化为0。 – Scheff
你搜索/重新搜索了什么? –
根据标准C编译器,默认情况下初始化全局变量为零,如果没有defined.at编译 –