1

これが私のコードです:

int main(){
    int n = 0;
    std::cin>>n;
    int lh[n][2];

    for(int i = 0; i < n; i++) {
        std::cin>>lh[i][0]>>lh[i][1];
    }
    return 0;
}

segmentfault 11n が非常に小さい場合は問題なく動作しますが、n が大きい場合、たとえば 10,000,000 の場合、エラーが発生する理由はわかりません。

何が起きてる ?

4

4 に答える 4

5

まず、これは有効な C++ ではありません。

std::cin>>n;
int lh[n][2];

n はコンパイル時定数でなければなりません。

第二に、すでに指摘したように、大きな n に対してメモリを使いすぎています

于 2013-10-28T09:33:31.363 に答える
1

おかしな話ですが、まさに「スタックオーバーフロー」です。「int x[n]」と言うと、スタックに割り当てられた配列 x のメモリ。デフォルトのスタック サイズは OS によって異なりますが、いずれにしても具体的な数値 (たとえば 8M) です。n が十分に大きい場合、スタック オーバーフローが発生します。この影響を回避するには、メモリをヒープに割り当てます。いえ

int *x = new int[n];
于 2013-10-28T09:41:03.520 に答える
1

本当に生の配列を使用したい場合は、動的に、つまりヒープに割り当てる必要があります。

int main(){
    int n = 0;
    std::cin>>n;
    int** lh = new int[n][2];

    // Allocate memory
    lh = new int*[n];
    for (int i = 0; i < n; ++i)
        lh[i] = new int[2];

    // Assign values
    lh[0][0] = 3;
    lh[1][2] = 4;

    // De-Allocate memory to prevent memory leak
    for (int i = 0; i < n; ++i)
        delete [] lh[i];
    delete [] lh;
    return 0;
}

ただし、おそらくまだ多次元の生のヒープ配列の準備が整っていないため、std::vector代わりに小さい配列サイズを使用することを強くお勧めします。

int main(){
    int n = 0;
    std::cin>>n;

    std::vector<std::vector<int> > myVec;
    for(int i = 0; i < n; i++) 
    {
        std::vector<int> tempV;
        int input = 0;
        cin >> input;
        tempV.push_back(input);
        cin >> input;
        tempV.push_back(input);

        myVec.push_back(std::move(tempV));
    }
    return 0;
}
于 2013-10-28T09:50:56.183 に答える
0

ここにいくつかのケースがあります: 10,000,000 はおそらくプラットフォームの整数データ型の範囲外です。あなたのコードでは、iとの両方nが整数です。ここでも、スタックにそれほど多くのスペースを割り当てることができない場合があります (これもプラットフォームによって異なります)。

于 2013-10-28T09:30:43.347 に答える