假设我有以下C代码:
union foo {
int x;
double y;
} k;
char word[] = "Stack Overflow";
int number = 1;
void doStuff(int n) {
static char c = 'C';
char *ptr = malloc(n);
}
int main(int argc, char *argv[]) {
int r = 120;
k.x = 10;
doStuff(r);
return 0;
}
编译器可以识别哪些变量?我知道全局变量
k
,word
和number
以及c
是静态的,但是函数中的变量(例如r
和*ptr
)又如何呢? 最佳答案
对象的存储空间是根据以下(不完整的)规则在运行时分配的:
如果在文件作用域(任何函数的主体之外)或使用关键字static
声明了对象,则可以保证在程序启动时预留并初始化该对象的存储,并在程序退出时将其释放。
如果在没有static
关键字的块中声明了对象,则可以保证在程序进入对象的封闭范围时保留该对象的存储空间,并在程序退出该范围时释放该对象的存储空间。实际上,据我所知,大多数编译器都会生成代码,以在函数入口分配所有此类块范围变量。
有关更完整的列表,请参见C 2011标准online draft的6.2.4节。