cin一个非常大的int数组,段错误11

时间:2013-10-28 09:27:17

标签: c++

这是我的代码:

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;
}

我不知道为什么,如果n非常小,它运行正常,但是当n更大时,比如10,000,000,结果是segmentfault 11错误。

这里发生了什么?

4 个答案:

答案 0 :(得分:5)

首先,这不是有效的C ++。

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

n应该是编译时常量。

其次如前所述,你正在为大n使用太多内存

答案 1 :(得分:1)

这很有趣,但确实是'堆栈溢出'。 当你说'int x [n]'时,在堆栈上分配的数组x的内存。默认的堆栈大小取决于操作系统,但无论如何它都是一些具体的数字(比方说8M)。当n足够大时,会发生堆栈溢出。要避免这种影响,请在堆上分配内存。即

int *x = new int[n];

答案 2 :(得分: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;
}

答案 3 :(得分:0)

这里的几个案例:10,000,000可能超出平台中整数数据类型的范围。在您的代码中,in都是整数。 您可能无法在堆栈上分配那么多空间(再次取决于平台)。