0

main() の変数はいつ割り当てられますか? 特に、次の配列 arr および 2d へのポインターに割り当てられるメモリの量:

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

これらは自動、グローバル、または静的と見なされますか?

4

2 に答える 2

2

これらの変数はすべて自動です。グローバル変数は関数のスコープ外で宣言する必要があります。静的変数にはstatic修飾子が必要です。

正確なサイズはシステムによって異なります。sizeof(arr)sizeof(b)などを印刷することで確認できます。

自動変数の割り当ての正確な時間はコンパイラに依存します。それらの一部は関数に入ったときに割り当てられ、一部はそれらが使用されるブロックに入ったときに割り当てられ、一部は最適化されてまったく割り当てられない場合があります。

于 2012-07-28T03:25:26.900 に答える
1

関数内で宣言されたすべてのローカル変数のメモリは、実行時に関数を実行する前に割り当てられます。関数ごとに、すべてのローカル変数を含むアクティベーション レコードがプロセス メモリのスタックに作成されます。関数の実行が完了すると、アクティベーション レコードが表示されます。

またはautoとして明示的に宣言されていない限り、関数内で宣言されたすべての変数はのみと見なされます。関数の外で宣言された変数は、グローバルと見なされます。staticregister

変数が関数の内部または外部で static として宣言されている場合、メモリの割り当てはコンパイル時に行われ、データ セグメント (または bss) で行われることを意味します。

すべてのポインター変数は、(任意の型または関数の変数の) 仮想アドレスを格納します。したがって、ポインター変数のサイズは、32 ビット マシンの場合は 4 バイト、64 ビット マシンの場合は 8 バイトです。

于 2012-07-29T07:10:15.577 に答える