C指针数组分配

时间:2012-07-28 03:22:56

标签: arrays pointers allocation

main()中的变量何时被分配?特别是在下面的指针arr和2d中分配了多少内存:

int main()
{
  float a, b;
  int *b;
  float *(arr)[6];
  float *(2d)[5][5];
}

这些是自动,全局还是静态?

2 个答案:

答案 0 :(得分:2)

所有这些变量都是自动的:全局变量需要在函数范围之外声明;静态变量需要static修饰符。

确切的大小取决于系统。您可以打印sizeof(arr)sizeof(b)

来查找

自动变量分配的确切时间取决于编译器:其中一些是在进入函数时分配的,有些是在进入使用它们的块时,有些可能是优化的,而根本没有分配。

答案 1 :(得分:1)

在执行函数之前,将在运行时分配函数内声明的所有局部变量的内存。对于每个函数,将在进程内存的堆栈中创建激活记录,该记录将包含所有局部变量。一旦功能执行完成,激活记录将被激活。

除非将autostatic显式声明为函数,否在函数外声明的变量将被视为全局变量。

如果变量在函数内部或外部声明为静态,则意味着内存分配将在编译时自行完成,这将在数据段(或bss)中完成。

所有指针变量都将存储一些虚拟地址(任何类型或函数的变量)。因此,在32位机器的情况下,指针变量的大小为4个字节,在64位机器的情况下为8个字节。