Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 代码使用vector成功运行,但使用数组显示错误_C++_Arrays_Vector_Segmentation Fault_Dynamic Memory Allocation - Fatal编程技术网

C++ 代码使用vector成功运行,但使用数组显示错误

C++ 代码使用vector成功运行,但使用数组显示错误,c++,arrays,vector,segmentation-fault,dynamic-memory-allocation,C++,Arrays,Vector,Segmentation Fault,Dynamic Memory Allocation,我在练习一个数组操作问题。在求解时,我声明了一个数组(代码中的数组)。 对于一些测试用例,我得到了一个分段错误。我用向量替换了数组,得到了AC。我不知道原因。请解释一下 #包括 使用名称空间std; int main() { int n,m,a,b,k; cin>>n>>m; 向量A(n+2); //长整数A[n+2]={0}; 对于(inti=0;i>a>>b>>k; A[A]+=k; A[b+1]=k; } 长res=0; 对于(int i=1;i),因为看起来你在C++中没有编程很长时间,

我在练习一个数组操作问题。在求解时,我声明了一个数组(代码中的数组)。 对于一些测试用例,我得到了一个分段错误。我用向量替换了数组,得到了AC。我不知道原因。请解释一下

#包括
使用名称空间std;
int main()
{
int n,m,a,b,k;
cin>>n>>m;
向量A(n+2);
//长整数A[n+2]={0};
对于(inti=0;i>a>>b>>k;
A[A]+=k;
A[b+1]=k;
}
长res=0;

对于(int i=1;i),因为看起来你在C++中没有编程很长时间,所以我会尝试分解它,让它更容易理解: 首先,C++不为你初始化任何值,这不是java,所以请不要这样做:

int n,m,a,b,k;
然后使用:

A[a]+=k;
A[b+1]-=k;

此时,我们不知道a和b是什么,据我们所知,它可能是-300。因此,有时你会幸运,编译器初始化的数字不会导致分段错误,而其他时候你就不那么幸运,编译器初始化的值会导致分段错误。

long int a[n+1]={ 0 };在标准C++中是不合法的。为此,我认为你们在其中一个方面遇到了绊脚石。

允许可变长度数组的编译器以C99为例,在堆栈上分配数组。堆栈是一种有限的资源,对于台式计算机而言,通常在1到10 MB之间。如果用户输入足够大的
n
,数组将占据堆栈的过多部分或超出堆栈的边界,从而导致然后,这种行为表现为访问远离堆栈末端的内存时出现的分段错误,该内存不受程序控制。当堆栈溢出时,通常不会出现警告。通常情况下,您会发现程序崩溃或数据损坏,此时挽救程序为时已晚

另一方面,
vector
从freestore分配其内部缓冲区,在一台具有虚拟内存和64位寻址的现代PC上,freestore非常庞大,如果您试图超过它可以分配的范围,就会抛出异常

另一个重要区别是

long int A[n+2]={0};
很可能没有将数组初始化为零。g++就是这种情况。第一个字节将被设置为零,其余的未初始化。这就是使用非标准扩展的诅咒。你不能指望标准保证的行为


std::vector
将对整个数组进行零初始化,或将数组设置为您告诉它使用的任何值。

这是什么语言?请添加到标记中。请确保您提供的代码可以编译吗?此示例不编译。如果您对n、m、a、b和k使用的值进行硬编码,也会更有帮助。有很多方法不编译o在几个不同的地方破坏代码,并且在您的案例中不可能知道它是如何破坏的或在哪里破坏的。