代码使用向量成功运行,但使用数组显示错误
Code running successfully using vector but showing error using array
我正在练习一个数组操作问题。在求解时,我声明了一个数组(代码中的数组 A(。 对于某些测试用例,我遇到了分段错误。我用矢量替换了数组并得到了 AC。我不知道这是什么原因。请解释一下。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a,b,k;
cin>>n>>m;
vector<long int> A(n+2);
//long int A[n+2]={0};
for(int i=0;i<m;i++)
{
cin>>a>>b>>k;
A[a]+=k;
A[b+1]-=k;
}
long res=0;
for(int i=1;i<n+2;i++)
{
A[i]+=A[i-1];
if(res<A[i])
res=A[i];
}
cout<<res;
return 0;
}
由于看起来您已经很长时间没有在C++编程了,我将尝试为您分解它以使其更易于理解: 首先,c ++不会为您初始化任何值,这不是Java,所以请不要这样做:
int n,m,a,b,k;
然后使用:
A[a]+=k;
A[b+1]-=k;
在这一点上,我们不知道 a 和 b 是什么,据我们所知,它可能是 -300,你从未初始化过它。因此,偶尔你会很幸运,编译器启动的数字不会导致分段错误,而其他时候你没有那么幸运,编译器初始化的值确实会导致分段错误。
long int A[n+2]={0};
在标准C++中是不合法的。这有很多原因,我想你偶然发现了其中一个。
允许可变长度数组的编译器遵循 C99 的示例,并将数组分配给堆栈。堆栈是有限的资源,对于台式计算机,通常在 1 到 10 MB 之间。如果用户输入足够大小的n
,数组将占用过多的堆栈或超出堆栈的边界,从而导致未定义的行为。然后,这种行为表现为访问内存的分段错误,该内存远离堆栈的末端,以至于不受程序控制。堆栈溢出时通常不会发出警告。通常,程序崩溃或数据损坏是您发现的方式,到那时挽救程序为时已晚。
另一方面,vector
从自由存储中分配其内部缓冲区,并且在具有虚拟内存和 64 位寻址的现代 PC 上,免费存储非常大,如果您尝试超出它可以分配的范围,则会引发异常。
另一个重要的区别是
long int A[n+2]={0};
可能没有将数组初始化为零。g++ 就是这种情况。第一个字节将设置为零,其余字节未初始化。这就是使用非标准扩展的诅咒。您不能指望标准所保证的行为。
std::vector
将初始化整个数组或将数组设置为您告诉它使用的任何值。
- 显示错误输出的简单数组排序程序
- 显示数组中的学生 ID 和最高分
- 代码使用向量成功运行,但使用数组显示错误
- 对象初始化后在C++中显示 char 数组时的异常行为
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 在命令行上将输入显示到数组中时如何删除 ./a.out?
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 如何在函数中显示结构数组
- 显示结构数组
- 在数组中显示第一个元素用户输入
- 在大小为 10 的 char 数组中输入超过 10 个字符的字符串并输出时,它会显示整个数组而不是前 10 个数组.为什
- 我编写了一个程序来显示数组的内容,但它显示的是它的地址
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 将 5 个 for 循环压缩为,将数组显示为 1
- 为什么析构函数和复制构造函数使用对象数组显示此行为
- 在VC2010中使用Char数组显示字符串时发生运行时错误
- 将数组显示为表格
- 从boost::p roperty_tree读取数组显示为空白
- c++错误数组显示
- 二维动态数组c++显示问题