我认为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).仅仅因为它在您执行的测试中为零,并不意味着它总是或者您可以依赖于该行为.即使使用相同的编译器,行为也可能会发生变化,具体取决于编译选项和优化级别.
局部非static变量未初始化——这通常意味着它们包含垃圾。
0与任何其他值一样有效的垃圾值。但初始值也可以很容易地变为42或-12345。
只是不要那样做。您需要确保不会读取任何变量的值,除非它已被初始化。读取未初始化的变量具有未定义的行为,这意味着可能的行为不限于打印某些任意值。
一个好的方法是使用显式初始化程序:
int n = 0;
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,您缺少必需的#include <stdio.h>,并且正确的声明main是int main(void)。)