C:编译器识别哪些变量?

时间:2017-03-24 20:35:02

标签: c compilation

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

1 个答案:

答案 0 :(得分:2)

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

  • 如果在文件范围(在任何函数的主体之外)或使用关键字static声明对象,则保证在程序启动时保留对象的存储并初始化程序退出时发布。

  • 如果在没有 static关键字的块中声明对象,则当程序进入对象的封闭范围时,保证对象的存储被搁置。程序退出该范围时发布。 在实践中,我所知道的大多数编译器都会生成代码,以便在函数入口处分配所有这些块范围变量。

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