3

メイン関数で動的サイズの配列を宣言したい場合は、次のことができます。

 int m;
 cin>>m;
 int *arr= new int[m];

コンパイラは、外部シンボルの場合を除き、すべてのシンボルのサイズを知る必要があるため、コンパイル中に次のことを行うことはできません。

 int m;
 cin>>m;
 int arr[m];

私の質問は次のとおりです。

  1. 上記のコードでコンパイラが arr のサイズを知る必要があるのはなぜですか? シンボルテーブルに定義されていないローカルシンボルです。実行時に、スタックがそれを処理します (m と同じ方法)。それは、コンパイラが定義されているすべてのオブジェクトのサイズに等しい main() (グローバル シンボル) のサイズを確認する必要があるためですか?

  2. 関数がある場合:

    int func(int m)
    

    関数内で int arr[m] を定義できますか、それともしなければなりませんか

    int *a= new int[m]
    
4

2 に答える 2

1

質問に答えるには:

1) Q: 上記のコードでコンパイラが arr のサイズを知る必要があるのはなぜですか?

A: アセンブリ出力を生成すると、配列をスタックに割り当てるために固定値の「減算」が行われることに気付くでしょう。

2) Q: 関数内で int arr[m] i ... を定義できますか?

A: もちろんできます。そして、関数を終了した瞬間に無効になります;)

基本的に、「配列」は必要ありません。C++ の「ベクトル」は良い代替手段です。

std::vector<A> v(5, A(2));

以下に、お楽しみいただけるリンクをいくつか示します。

于 2012-09-09T05:33:28.640 に答える