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
register
変数が関数の内部または外部で static として宣言されている場合、メモリの割り当てはコンパイル時に行われ、データ セグメント (または bss) で行われることを意味します。
すべてのポインター変数は、(任意の型または関数の変数の) 仮想アドレスを格納します。したがって、ポインター変数のサイズは、32 ビット マシンの場合は 4 バイト、64 ビット マシンの場合は 8 バイトです。