为什么使用内置数组而不是向量或new时会出现分段错误[关闭]

问题描述 投票:0回答:1

我正在初始化一个全零的 n 大小的数组。使用向量类或使用“new”分配可以工作,但使用内置数组时,我在 hackerrank c++ 中遇到分段错误。

long long arr[n];
for(int a = 0;a < n;a++) {
    arr[n] = 0;
}
//segmentation fault in some cases.
long long arr = new long long[n]; // doesn't fail
vector<long long> arr(n,0); // works also

完整代码:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;
typedef long long ll;

int main()
{
    ll n,m;
    ll biggest = 0;
    ll current = 0;
    cin >> n >> m;
    ll arr[n];
    for(int a = 0;a < n;a++) {
    arr[a] = 0;
    }

    for(int i = 0;i < m;i++) {
    ll a,b,k;
    cin >> a >> b >> k;
    arr[a - 1] += k;
    if(b < n) arr[b] -= k;
    }
    for(int j = 0;j < n; j++) {
    current += arr[j];
    biggest = max(current,biggest);
    }
    cout << biggest << endl;
    return 0;
}

为什么内置失败?

问题链接

c++ arrays vector segmentation-fault
1个回答
1
投票

问题本身已经巧妙地回答了。从堆栈分配内存是可以的,但仅限于少量内存。 Hackerrank问题可能有很大的输入n。根据经验,堆栈中可以保留 10^6 个整数,因为考虑到每个整数 4 个字节,这大约为 4 MB。对于更大的东西,请使用具有更高限制的 new 关键字从堆中使用动态内存。

© www.soinside.com 2019 - 2024. All rights reserved.