C++ 程序数组开的稍大 (2000 * 2000) 就报 Segmentation fault: 11

2015-07-12 11:17:39 +08:00
 DIJ
Mac OS X Yosemite 下,用 clang 编译。

@segmentfault XD
3247 次点击
所在节点    问与答
8 条回复
hahastudio
2015-07-12 11:22:37 +08:00
znoodl
2015-07-12 11:27:32 +08:00
这么大居然不用new/malloc
DIJ
2015-07-12 11:29:05 +08:00
@hahastudio
其实刚才找到了,但是本来就是开在函数外部的数组,加了 static 的效果是本来在输入数据前报错,现在在输入之后报错......

vector 竞赛貌似并不能用......以前在 Windows / Linux 下完全没有这种问题......
kzzhr
2015-07-12 11:59:58 +08:00
函数体内的数组会放在栈中,一般会爆。
可以强制改一下,(竞赛允许改这个。至于vector还是算了,会慢哭你的)
#pragma comment(linker, "/STACK:1024000000,1024000000")

不过还是推荐使用malloc/calloc把数组放在堆上或者开全局
yksoft1
2015-07-12 13:20:44 +08:00
记得ACM学习里面有专门提到如何有效实现大内存分配
aheadlead
2015-07-12 13:56:09 +08:00
你或许是定义在某个函数里面吧

int main() {
int arr[2000][2000]; // segmentation fault here
return 0;
}

一个 int 变量占用 8 字节空间
2000 * 2000 * 8 = 32000000B = 30.517578125MB

你用 ulimit -s 看看栈大小,应该是比 30 要小。

Workaround

int arr[2000][2000];
int main() {
return 0;
}

全局变量存在于静态区,这样就没有爆栈的问题了。
aheadlead
2015-07-12 13:56:25 +08:00
妈蛋 回复不能用markdown吗
lirau
2015-07-12 14:14:48 +08:00
简单来讲 内存分配分为堆栈两种 你可能是局部产量超过栈的大小了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/205094

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX