假设我有以下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
?
答案 0 :(得分:2)
根据以下(不完整的一组)规则在运行时分配对象的存储:
如果在文件范围(在任何函数的主体之外)或使用关键字static
声明对象,则保证在程序启动时保留对象的存储并初始化程序退出时发布。
如果在没有 static
关键字的块中声明对象,则当程序进入对象的封闭范围时,保证对象的存储被搁置。程序退出该范围时发布。 在实践中,我所知道的大多数编译器都会生成代码,以便在函数入口处分配所有这些块范围变量。
有关更完整的列表,请参阅C 2011标准online draft的第6.2.4节。