假设我有以下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;
}


编译器可以识别哪些变量?我知道全局变量kwordnumber以及c是静态的,但是函数中的变量(例如r*ptr)又如何呢?

最佳答案

对象的存储空间是根据以下(不完整的)规则在运行时分配的:


如果在文件作用域(任何函数的主体之外)或使用关键字static声明了对象,则可以保证在程序启动时预留并初始化该对象的存储,并在程序退出时将其释放。
如果在没有static关键字的块中声明了对象,则可以保证在程序进入对象的封闭范围时保留该对象的存储空间,并在程序退出该范围时释放该对象的存储空间。实际上,据我所知,大多数编译器都会生成代码,以在函数入口分配所有此类块范围变量。


有关更完整的列表,请参见C 2011标准online draft的6.2.4节。

10-05 22:59
查看更多