CIN 一个非常大的 int 数组,段故障 11

cin a very big int array, segment fault 11

本文关键字:数组 段故障 故障 int 一个 非常 CIN      更新时间:2023-10-16

这是我的代码:

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错误。

这是怎么回事?

首先,

这C++无效。

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

n 应该是编译时常量。

其次,正如已经指出的,您对大 n 使用了太多内存

如果你真的想使用一个原始数组,你必须动态分配它,即在堆上:

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

这很有趣,但它正是"堆栈溢出"。当您说"int x[n]"时,表示堆栈上分配的数组 x 的内存。默认堆栈大小取决于操作系统,但无论如何它是一些具体的数字(假设 8M)。当 n 足够大时,会发生堆栈溢出。若要避免此影响,请在堆上分配内存。即

int *x = new int[n];

这里有几种情况:10,000,000 可能超出了您平台中整数数据类型的范围。在代码中,in都是整数。同样,您可能无法在堆栈上分配那么多空间(同样取决于平台)。