2

次のコードを使用して動的割り当ての動作を模倣することは可能ですか? たとえば、ファイルに格納されている整数の正確な数がわからない場合、ファイルを読み取り、Hello という配列に格納します。

int x;
int n=0;
ifstream input("a.dat");
while (!input.eof())
{
    input >> x;
    n++;
}
input.close();

int Hello[n];
cout << "n= " << n << endl;

int i=0;
while (!input.eof())
{
    input >> Hello[i];
    i++;
}
4

4 に答える 4

2

次のコードを使用して動的割り当ての動作を模倣することは可能ですか?

いいえ、主な違いは、プログラム内の配列がスタックに格納されるのに対し、すべての動的メモリ割り当てはヒープで行われることです。

あなたが正確に行っていることは、コードで C++ の C の C99 標準の VLA 機能を使用することです。g++ コンパイラで -pedantic オプションを使用してコンパイルすると、これが明らかになります。これは c++ によって直接サポートされておらず、実装固有の言語拡張であるため、移植可能なコードを作成する場合は、これを使用するのはあまり良い考えではありません。

VLA の使用alloca()、実行時にスタックにメモリを割り当てる方法、およびそのような手法の欠点については、こちらで説明しています。

さらに、VLA は実行時にスタックにメモリを割り当てます。値が範囲を超えた場合、プログラムは単純にクラッシュしますが、VLA を使用して数バイトの配列をすばやく作成することは問題ありませんが、不確かな量の大きなメモリを作成することは安全ではない可能性があります。動的メモリ割り当てを使用して処理することをお勧めします。

于 2013-04-28T04:45:57.230 に答える
1
int Hello[n];

割り当てではあり ません。 この方法で宣言する場合は、コンパイル時定数がdynamic必要です。nHello

試す:

int* Hello = new int[n];

使い終わったら、メモリを解放することを忘れないでください。

delete[] Hello;
于 2013-04-28T04:09:34.453 に答える
0

2番目の開始

while (!input.eof())

必ず失敗します。これで最初のストリームが終了し、その入力ストリームを閉じようとしました!

于 2013-04-28T05:19:37.247 に答える