main() 中的变量何时分配?特别是为指向数组 arr 和 2d 的指针分配了多少内存,如下所示:
int main()
{
float a, b;
int *b;
float *(arr)[6];
float *(2d)[5][5];
}
这些被认为是自动的、全局的还是静态的?
main() 中的变量何时分配?特别是为指向数组 arr 和 2d 的指针分配了多少内存,如下所示:
int main()
{
float a, b;
int *b;
float *(arr)[6];
float *(2d)[5][5];
}
这些被认为是自动的、全局的还是静态的?
所有这些变量都是自动的:全局变量需要在函数范围之外声明;静态变量需要有static
修饰符。
确切的大小取决于系统。您可以通过打印sizeof(arr)
,sizeof(b)
等查找。
分配自动变量的确切时间取决于编译器:其中一些是在进入函数时分配的,有些是在进入使用它们的块时分配的,还有一些可能被优化出来,根本没有分配。
函数内声明的所有局部变量的内存将在运行时分配,然后再执行函数。对于每个函数,将在进程内存的堆栈中创建一个激活记录,其中包含所有局部变量。功能执行完成后,将弹出激活记录。
函数内声明的所有变量都被视为auto
仅,除非它被显式声明为static
or register
。在函数外部声明的变量将被视为全局变量。
如果一个变量在函数内部或外部声明为静态,则意味着内存分配将在编译时完成,这将在数据段(或 bss)中。
所有指针变量都将存储一些虚拟地址(任何类型或函数的变量)。所以指针变量的大小在 32 位机器的情况下是 4 个字节,在 64 位机器的情况下是 8 个字节。