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