2017-12-29 24 views
-3

これはおそらく簡単に解決できるものです。私は何が間違っているのか分かりません、このスーパーシンプルなコードで助けてください。アレイを作成する際のセグメンテーションフォルト

このプログラムを実行すると、配列の5つの値が出力され、セグメント化エラーが発生します。私はこれをどのように修正するのか、このタイプの問題を適切に実行する方法は知らない。どんな助けもありがとう、ありがとう。

+0

'arraysize'は、配列' a [arraysize] 'を宣言しているときにガベージ値を保持します。 –

+0

[Could not](http://coliru.stacked-crooked.com/a/301743aa2694a77a)はGCCで再現します。 VLAを使用しないで、VLAを使用する前に変数を初期化してください。 – Ron

+0

@AditiRawatによると、 'arraysize'は最初に使用された時点でガベージを保持します。さらに 'int a [arrayize]'は 'arraysize'に有効な値があっても有効なC++ではありません。コンパイラの中にはこれを拡張子として認めているものもありますが、あなたがやっていることが正直ではないという警告を出すべきです。 –

答えて

3

arraysizeは、aが構築されているときに指定された値がありません。つまり、aのサイズを指定する際に未定義の動作が呼び出されています。もつとも

#include <iostream> 

//Don't use "using namespace std;"! 
//using namespace std; 

int main() 
{ 
    //removed unused/unnecessary variables 
    int arraysize; 

    std::cout << "array size"; 
     std::cin >> arraysize; 

    int a[arraysize]; 

    for(int i = 0; i < arraysize; i++) { 
     int j = arraysize - i; 
     a[i] = j; 
     std::cout << "a[" << i << "] = " << a[i] << std::endl; 
    } 
} 

このコードの非未定義の動作バージョンはこれです。このように、実行時に配列サイズを指定することは、言語の非標準的な拡張であり、すべての環境で動作するわけではありません。このコードを標準に準拠させるには、std::vectorを使用する必要があります。

#include <iostream> 
#include <vector> 

int main() 
{ 
    int arraysize; 

    std::cout << "array size"; 
     std::cin >> arraysize; 

    std::vector<int> a(arraysize); 

    for(int i = 0; i < arraysize; i++) { 
     int j = arraysize - i; 
     a[i] = j; 
     std::cout << "a[" << i << "] = " << a[i] << std::endl; 
    } 
} 

私はあなたのコード、for these reasonsからusing namespace std;の使用を削除しました。

+0

正直、助けてくれました、ありがとうございました。 – theninja1011

0

これは明らかに未定義の動作です。
まず、C++標準は可変長配列をサポートしていません。 これはgccのようないくつかのコンパイラの拡張です。

arraysizeの値は、配列のインスタンス化時には定義されていないため、結果が予測できない場合がありますが、場合によっては動作する可能性がありますが、これは純粋な運に基づいています。

ダイナミックサイズの配列が必要な場合は、std::vectorを使用することをお勧めします。

#include <iostream> 

using namespace std; 

int main() 
{ 
    int arraysize, i, n, j; 
    std::vector<int> a; 

    cout << "array size"; 
    cin >> arraysize; 

    std::vector<int> a(arraysize); 

    for(int i=0, j = arraysize; i < arraysize, j > 0; i++, j--){ 
     a[i] = j; 
     cout << "a[" << i << "] = " << a[i] << endl; 
    } 

    return 0; 
} 
関連する問題