假设我有以下 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
声明的,则保证在该对象的存储空间被预留并初始化时程序启动并在程序退出时释放。如果在 block 中声明对象时没有使用
static
关键字,那么当程序进入该对象的内存时,保证会预留该对象的存储空间。封闭范围并在程序退出该范围时释放。 实际上,据我所知,大多数编译器都会生成代码以在函数入口处分配所有此类 block 作用域变量。
请参阅 online draft 的第 6.2.4 节C 2011 标准的更完整列表。
关于C:编译器可以识别哪些变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008686/