【发布时间】:2014-01-16 02:06:45
【问题描述】:
我以为C中的局部变量没有初始化。但是当我用 gcc 编译这段代码时。
void f() {
static int s;
int n;
printf("static s = %d\n", s++);
printf("local n = %d\n", n++);
f();
}
main() {
f();
}
并运行这段代码,部分结果是:
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
谁能解释一下?还是参考 C 不会初始化本地变量的标准参考?
【问题讨论】:
-
行为未定义;任何事情都可能发生。
-
@wannik - 运气。但不要指望它。这是未定义的行为。最好打开编译器警告
-
是的,未定义。另请参阅右侧“相关”下的几个先前答案。说真的,如果你希望它初始化为 0,请使用显式的初始值。
-
尝试单次调用两次,无需递归。一些操作系统,如 Windows 空闲进程中的零空闲内存。因此堆栈块可能已分配为零。
-
@EdHeal 我没有收到使用 -Wall -Wextra 的警告,编译器警告标志是什么?
标签: c