在C中始终初始化为零变量? [重复]

问题描述 投票:0回答:4
#include <stdio.h>
int a[100];
int main(){
    printf("%d",a[5]);
    return 0;
}

以上代码总是打印“ 0”,还是特定于编译器?我正在使用GCC编译器,然后将输出作为“ 0”。

c global-variables
4个回答
58
投票
a

的所有成员都可以初始化为0。

从C89Standard
的第3.5.7节中

如果一个具有静态存储持续时间的对象未初始化 明确地,它被隐式初始化,好像每个具有的成员 算术类型分配了0,每个具有指针类型的成员 被分配了一个无效的指针常数。

“全局变量”定义在
文件范围,任何函数之外。在文件范围和使用关键字

29
投票
声明的所有变量定义的所有变量均具有称为“静态存储持续时间”的内容。这意味着它们将被分配在记忆的单独部分,并存在于程序的整个生命周期中。

还意味着在任何C编译器上都保证将它们初始化为零。 当前C标准C11 6.7.9/10:

  
” ...如果未初始化具有静态或线程存储持续时间的对象 显式,然后: -如果它具有指针类型,则将其初始化为空指针;

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

实际上,这意味着,如果您将全局变量初始化为给定值,则它将具有该值,并且将在通常称为

.data
的内存段中分配。如果您不给它一个值,它将分配在一个称为

.bss

的部分中。全球永远不会在堆栈上分配。

是的。 任何全局变量均可初始化为该类型的

默认值

0

是默认值,并自动施放为任何类型。 如果是指针,

0
变成
NULL


10
投票
它是特定于编译器,但在C标准中定义。

因此将始终打印0.

未经显式初始化器声明的文件范围对象是由
0
默认情况下初始化的(对于指针)。
未经显式初始化器声明的块范围内的静态对象被非启用。
    

它不是编译器的特定于编译器。代码将始终打印NULL

在c?

中始终将Globle变量始终归功于零

yyes,它在C标准中定义。


3
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.