我正在初始化一个全零的 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;
}
为什么内置失败?
问题本身已经巧妙地回答了。从堆栈分配内存是可以的,但仅限于少量内存。 Hackerrank问题可能有很大的输入n。根据经验,堆栈中可以保留 10^6 个整数,因为考虑到每个整数 4 个字节,这大约为 4 MB。对于更大的东西,请使用具有更高限制的 new 关键字从堆中使用动态内存。