为什么使用内置数组而不是矢量或新数组时会出现分割错误



我正在初始化一个n大小的全零数组。使用向量类或用";新的";工作,但有了内置数组,我在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 int可以保留在堆栈上,因为考虑到每个整数4个字节,这大约是4MB。对于任何更大的东西,请使用new关键字使用堆中的动态内存,该关键字有更高的限制。

相关内容

  • 没有找到相关文章

最新更新