局部变量在C中初始化为零

wan*_*nik 6 c

我认为C中的局部变量没有初始化.但是当我用gcc编译这段代码时.

void f() {
    static int s;
    int n;

    printf("static s = %d\n", s++);
    printf("local  n = %d\n", n++);

    f();
}

main() {
    f();
}
Run Code Online (Sandbox Code Playgroud)

并运行此代码,部分结果是:

static s = 0
local  n = 0
static s = 1
local  n = 0
static s = 2
local  n = 0
static s = 3
local  n = 0
static s = 4
local  n = 0
static s = 5
local  n = 0
...
static s = 261974
local  n = 0
static s = 261975
local  n = 0
static s = 261976
local  n = 0
static s = 261977
local  n = 0
static s = 261978
local  n = 0
static s = 261979
local  n = 0
static s = 261980
local  n = 0
static s = 261981
local  n = 0
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?或者参考C不会初始化本地变量的标准参考?

har*_*mic 11

ISO/IEC 9899:TC3 WG14/N1256(C99标准)第6.7.8节第10节:

如果未显式初始化具有自动存储持续时间的对象,则其值不确定.

如果未显式初始化具有静态存储持续时间的对象,则:

  • 如果它有指针类型,则将其初始化为空指针;
  • 如果它有算术类型,则初始化为(正或无符号)零;
  • 如果是聚合,则根据这些规则初始化(递归)每个成员;
  • 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.

您的变量适合第一类.不确定意味着它可以是任何东西(包括0).仅仅因为它在您执行的测试中为零,并不意味着它总是或者您可以依赖于该行为.即使使用相同的编译器,行为也可能会发生变化,具体取决于编译选项和优化级别.


Kei*_*son 7

局部非static变量未初始化——这通常意味着它们包含垃圾。

0与任何其他值一样有效的垃圾值。但初始值也可以很容易地变为42-12345

只是不要那样做。您需要确保不会读取任何变量的值,除非它已被初始化。读取未初始化的变量具有未定义的行为,这意味着可能的行为不限于打印某些任意值。

一个好的方法是使用显式初始化程序:

int n = 0;
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,您缺少必需的#include <stdio.h>,并且正确的声明mainint main(void)。)