Mac 上 C++ 中的分段错误 11
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19522192/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
segmentation fault 11 in C++ on Mac
提问by mariusz2108
When I try to run this
当我尝试运行它时
int N=10000000;
short res[N];
I get segmentation fault 11
我得到分段错误 11
when I change to
当我改为
int N=1000000;
short res[N];
it works fine
它工作正常
回答by Bartek Banachewicz
You've exceeded your stack space given by the OS. If you need more memory, the easiest way is to allocate it dynamically:
您已超出操作系统提供的堆栈空间。如果需要更多内存,最简单的方法是动态分配:
int N=1000000;
short* res = new short[N];
However, std::vector
is preferred in this context, because the above requires you to free
the memory by hand.
但是,std::vector
在这种情况下是首选,因为上面需要您free
手动进行记忆。
int N = 1000000;
std::vector<short> res (N);
If you can use C++11, you can possibly save some fraction of time by using unique_ptr
array specialization, too:
如果你可以使用 C++11,你也可以通过使用unique_ptr
数组特化来节省一些时间:
std::unique_ptr<short[]> res (new short[N]);
Both of the automatic methods above can still be used with familiar res[index]
syntax thanks to overloaded operator[]
, but to get the raw pointer for memory operations you'd need res.data()
with vector
or res.get()
with unique_ptr
.
上述两种自动方法仍然可以使用熟悉的使用res[index]
语法由于超载operator[]
,但要得到你需要的内存操作的原始指针res.data()
与vector
或res.get()
有unique_ptr
。
回答by IdeaHat
You can't allocate all that on the stack. Try short* res = new short[10000000];
and don't forget to clean up.
您不能在堆栈上分配所有这些。尝试short* res = new short[10000000];
并且不要忘记清理。
Alternatively, you can use std::vector<short> res(10000000);
或者,您可以使用std::vector<short> res(10000000);