33855


行数、列数が９９以下の配列にstdinから読み込んだファイルを配列に格納するプログラムを書いていています。

無事コンパイルが通り期待どおりの結果が実効されるのですが、Abort trap 6エラーメッセージが出てしまいます。

**main関数のコード**

[code]

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main(){
        const int ROW_MAX = 3;
        const int COL_MAX = 3;
        int row_count=0;
        int col_count=0;
        string line;
    
        char arr[ROW_MAX][COL_MAX];
    
        while(getline(cin,line)){ //stdinから読み込み
            int l = line.length();
    
            if(l > COL_MAX){
                cout << "Column size is too big. Try less than " << COL_MAX << endl;
                return 1; //lineが列の数より多きい場合はエラー
            }
    
            for(int i=0; i<l; ++i) arr[row_count][i] = line[i];
    
            ++row_count;
            col_count = l;
    
            if(row_count > ROW_MAX){ // row_countがROW_MAXより大きい場合は読み取るのをやめる
                --row_count;
                break;
            }
    
        }
    
        cout << "row_count : " << row_count << endl;
        cout << "col_count : " << col_count << endl;
    
        cout << "Input table looks like " << endl;
    
        for(int i=0; i<row_count; ++i){
            for(int j=0; j<col_count; ++j)
                cout << arr[i][j];
            cout << endl;
        }
    
        cout << "It has " << col_count << " columns and " << row_count << " rows." << endl;
    
        return 0;
    }
    
[/code]

**stdin するファイルの中身**

[code]

    000
    010
    000
    000
    
[/code]

**./a.out < ファイル名 の結果**

[code]

    row_count : 3
    col_count : 3
    Input table looks like 
    000
    010
    000
    It has 3 columns and 3 rows.
    Abort trap: 6
    
[/code]

なぜAbort trap 6が出てしまうのかどなたか教えていただけないでしょうかm(_ _)m


CC BY-SA 3.0
2017-04-08T00:54:42.697
33854
2017-04-08T03:03:12.363
2017-04-08T03:03:12.363
18535
18535
question
c++ array
C++で配列を扱うプログラムで Abort trap 6のエラーメッセージを出てしまう


サイズ3(=ROW_MAX)の配列(arr)に4つの要素を代入しているので、未定義動作になっているのではないでしょうか?

arrはローカル変数、つまりスタック上に確保した変数なので、4つ目の要素代入の際にスタック破壊が発生しており、main関数から戻る際に未定義動作していると予想します。  
(Abortなので、それなりに純正常な動作のようですが)

なお、各要素を格納する際に、文字列の終端文字(\0)も入れるようにした方がいいです。  
(質問例だと問題になりませんが)


CC BY-SA 3.0
2017-04-08T02:20:51.237
33855
2017-04-08T02:20:51.237
20098
33854
answer