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

时间:2017-06-20 05:45:56

标签: c variables initialization global-variables

如果我在C程序中使用未初始化的全局变量,会发生什么?是不确定的行为?

#include <stdio.h>

int i;

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

2 个答案:

答案 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 是完全可以的。 此处没有未定义的行为。