2009-04-10 1 views
47

私は数年前からC++を使用していましたが、今日はいくつかのコードを見ましたが、どうすれば完全に合法的になりますか?動的割り当てのない実行時の配列サイズは許されますか?

int main(int argc, char **argv) 
{ 
    size_t size; 
    cin >> size; 
    int array[size]; 
    for(size_t i = 0; i < size; i++) 
    { 
     array[i] = i; 
     cout << i << endl; 
    } 

    return 0; 
} 

GCCでコンパイルされています。

実行時にサイズを決定するには、newまたはmallocを使用しないでください。

ダブルチェックでは、私はいくつかのグーグルと同様のすべてのコードは、ストレージサイズのエラーを与えると主張されています。

Even Deitel's C++ How To Program p。共通プログラミングエラー4.5以下の261状態:

自動および静的配列のサイズを宣言するために定数のみを使用できます。

私を怒らせる。

+2

ノートDMAは、「ダイレクトメモリアクセス」を意味する - 私はあなたが動的割り当て –

+2

CまたはC++について尋ねていると思いますか?一つを選ぶ_。 –

+1

もう一度、CまたはC++を選択します。この質問は明示的であり、Cについてのみです。 C++タグはありません。 –

答えて

49

これはC99で有効です。

C99標準では、スタック上の可変サイズのアレイをサポートしています。おそらくあなたのコンパイラはこの構造体をサポートすることを選択したでしょう。

mallocおよびnewとは異なります。 gccは、スタックポインタを調整するだけでint array[100]と同じように、スタックに配列を割り当てます。ヒープ割り当ては行われません。それはかなり_allocaのようなものです。

+7

私は数ヶ月前に書かれたコードベースのファイルで、この同じシナリオに遭遇しました。チームの残りの人たちと同じように、私は困惑した。私たちの状況では、配列を宣言する前に配列のサイズが計算されていました(どちらも許されるべきではありませんか?)とにかく、課題が出ました。なぜこれが合法であると答えることができるのか誰もがポップアップしています。あなたがシアトルにいるなら、私に知らせてください。私はあなたのためにポップなタルトを持っています。 –

+0

この場合、内部的にスタックの仕組みに関する情報やリンクを提供できますか?実行時にオーバーヘッドが発生しますか? – balki

+1

@balkiオーバーヘッドは基本的にスタックポインタをインクリメント/デクリメントするので、マイナーです。関数の先頭に元のスタックポインタを保存すると、スタックの動作は本質的に通常の場合と同じになります。 –

4

これは有効なC99であり、有効なC++ではありません。これは、2つの言語の間にいくつかの違いがあります。

+2

は、私はドラフト標準のセクション8.3.4に従っていないC++ 0xの –

+0

でサポートされるようになるだろうと思います。 –

+2

これはC++ 1x:Dに含まれることはありませんが、dynarray が入ることを願っています。私はそれを愛するでしょう。だからあなたはdynarray (some_size)をすることができます。おそらく_allocaのようなコンパイラhaxを使って効率的に割り当てる必要があります。 –

18

これは、VLA(可変長配列)として知られています。これはc99の標準ですが、gccでは拡張子としてC++コードで使用できます。コードを拒否するには、-std=standard-ansi-pedanticのオプションを試してみてください。

0

Dev-Cppコンパイラを使用している場合、配列に動的にサイズを与えることができます。私は を試してみましたが、エラーはありませんが、Visual C++およびVisual Studioコンパイラでは不可能です。 私は理由はdev-C++が初期化されていないint に正の数を割り当てていると思います。数字を与えると、それは与えられたものに置き換えられます。 しかし、おそらく他のコンパイラは初期化されていない変数にnullを与えます。

+0

ほとんどのコンパイラは、初期化されていないローカル変数には何も割り当てません。通常は、プログラムによって割り当てられるまで、占有されていたメモリを保持しているように見えます。あなたが参照したDev-C++はMinGWの上にあるIDEで、コンパイラとしてGCCのポートを含んでいます。他の回答に書かれているように、VLAは標準のC++ではありませんが、g ++を含むいくつかのコンパイラがそれらをサポートしています。 – jerry

+0

Dev-C++はコンパイラではありません。どちらもVisual Studioではありません。 Dev-C++はGCC/G ++をコンパイラとして使用し、Visual Studioはcl(Microsoftのコンパイラバックエンド)を使用します。それだけで、Dev-C++とVisual Studioは統合開発環境(IDE)です。これは重要な違いです。 Dev-C++は何も "割り当て"ません。コンパイラはそれを行います。 – Elkvis

-1

可変長アレイ(VLA)は、C++ 14標準でサポートされています。これは最近承認されており、公開を待っています。

+1

VLAはまだ標準の一部ではありません。 [dynarray](http://en.cppreference.com/w/cpp/container/dynarray)TSがありますが、まだ批准されていません。 – Jason

0

このコードはGNU GCCコンパイラで動作します。

#include<bits/stdc++.h> 

int main(int argc, char **argv) 

{ 
    size_t size; 

    std:: cin >> size; 

    int array[size]; 

    for(size_t i = 0; i < size; i++) 

{ 

array[i] = i; 

     std:: cout << i; 

} 

    return 0; 
} 
関連する問題