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

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

这里发生了什么 ?

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的内存分配在堆栈上。默认堆栈大小取决于操作系统,但无论如何它是一个具体的数字(比如说 8M)。当 n 足够大时,就会发生堆栈溢出。为避免这种影响,请在堆上分配内存。IE

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 可能超出了您平台中整数数据类型的范围。在您的代码中in都是整数。同样,您可能无法在堆栈上分配那么多空间(再次取决于平台)。

于 2013-10-28T09:30:43.347 回答