【发布时间】:2015-06-09 20:19:50
【问题描述】:
我很想了解 C 中以下内容的效果:
int func(int arg) {
if (arg == 0) {
double *d = malloc(...);
}
//...
}
我的理解是:
- 无论
arg的值如何,调用func时都会为指针d腾出堆栈空间 -
d仅被初始化,即malloc被调用,如果arg == 0 -
d只能在 if 块内部访问;尝试在外部访问它会产生一个编译错误 - 即使d的堆栈空间无论如何都已分配。
所以,除了阻止访问 if 块之外的范围规则之外,它等价于以下内容:
int func(int arg) {
double *d;
if (arg == 0) {
d = malloc(...);
}
//...
}
这是正确的吗?我正在使用icc 默认设置进行编译,这似乎是std=gnu89。
【问题讨论】:
-
第一点可能不正确。可能依赖于编译器。
-
甚至不必有 any 堆栈。 C 不强制要求堆栈,即使使用堆栈,编译器也可以将变量保存在寄存器中。