使用未初始化的全局变量(用于读取和写入)可以吗?

问题描述:

如果我在C程序中使用未初始化的全局变量,会发生什么情况?它是不确定的行为?使用未初始化的全局变量(用于读取和写入)可以吗?

#include <stdio.h> 

int i; 

int main() 
{ 
    while(i < 5) 
    { 
     i++; 
    } 
    printf("%d\n", i); 
    return 0; 
} 
+3

如果没有显式的初始化,全局变量将被初始化为0。 – Scheff

+0

你搜索/重新搜索了什么? –

+1

根据标准C编译器,默认情况下初始化全局变量为零,如果没有defined.at编译 –

TL; DR不,你没事。

但是不要拿我的话来说吧,让我们再看看更多关于为什么部分,继权威消息。

首先,让我们看看标识符(变量)的范围。

注:所有重点矿山

作为每C11,章§6.2.1

如果声明了标识符 的声明符或类型说明符出现任何块的外部或参数列表中,标识符的文件范围为,其中 终止于翻译单元的末尾。

然后,从章§6.2.2

[...]如果 的标识符的某个对象的声明有文件范围和没有存储类说明, 其连接是外部

,最后,对于存储类,章第6.2.4节,

其标识符被声明而不存储类说明 _Thread_local,并且用外部或内部联动的对象或与存储级别 说明符static,具有静态存储持续时间

因此,您提到的全局变量具有静态存储持续时间。

现在,你说,它没有明确初始化,让我们看看规范有什么要说的。

引用章节§6.7。9/P10,

如果具有静态或线程存储持续时间的对象没有初始化 明确,然后

- 如果它有指针类型,它被初始化为空指针;

- 如果它有算术类型,它被初始化为(正或无符号)零;

- 如果它是一个聚合,每个成员根据这些规则初始化(递归), 和任何填充初始化为零位;

- 如果它是一个联合,根据这些 规则初始化第一个命名成员(递归),并且任何填充都初始化为零位;

所以,变量具有定义的值即使没有明确的初始化,所以使用该变量阅读是完全确定。 这里没有未定义的行为。

它是不确定的行为?

会发生什么号?

i具有静态存储持续时间(文件范围)。它会默认初始化为零。