我为学校的小竞赛做了一个程序,我有:
#include <iostream>
#include <vector>
int main(){
int n;
std::cin >> n;
int c[n];
std::vector<int> r(n);
std::cout << "I made it through";
//rest of program
}
当我键入1000000并按下输入程序崩溃时,退出代码(0xC00000FD)。我推测它发生在我初始化矢量时,但我可以处理更多。难道我做错了什么?我知道我可以使用指针,但我不想触摸已经有效的东西。
答案 0 :(得分:2)
堆栈是一种非常有限的资源。
即使您的编译器似乎在C ++(int c[n];
)中实现C风格的VLA,它也不会神奇地获得更多内存。
测试1)在执行分配该堆栈数组的语句之前,读取n
和2)n
的成功不会超出您的使用范围。
Windows的默认堆栈大小:1MB sizeof(int)
:4因此,大约250000适合
Linux的默认堆栈大小:8MB sizeof(int)
:4因此,大约2000000适合。
解决方法:对int
使用动态分配,例如使用std::vector
:
std::vector<int> c(n);
或者,至少使用智能指针:
std::unique_ptr<int[]> c(new int[n]);
答案 1 :(得分:1)
问题不是vector
(在大多数STL实现中将堆用于其底层扩展存储),而是int c[n]
,它将在堆栈中分配1,000,000个4字节整数,这是差不多4MB。在Win32上,堆栈默认大约为1MB,因此溢出。
如果确实需要使用数组,请使用c
更改要在堆上分配的new
数组,但不要忘记delete[]
,否则使用{ {1}}是大多数扩展存储方案的首选。如果你需要一个固定长度的数组,那么考虑添加边界检查的vector
(C ++ 11中的新增内容)。
答案 2 :(得分:0)
您可能只需要动态分配数组。在C ++中
#include <iostream>
#include <vector>
int main()
{
int n;
std::cin >> n;
int *c = new int[n];
if(nullptr == c) {
std::cerr << "Runtime error" << std::endl;
return 1;
}
std::vector<int> r(begin(n), end(n));
std::cout << "I made it through";
delete[] c;
return 0;
}
在动态分配c
之后制作向量时,您可以使用begin
,end