【发布时间】:2013-11-06 02:09:40
【问题描述】:
我有一个int flags[(1<<20)]; 数组,似乎有问题,导致分段错误。这是堆栈溢出问题吗?我应该设置多少堆栈大小以及如何设置?
【问题讨论】:
-
请添加一个标签,指明您使用的语言。 (C?C++?)
标签: arrays gcc openmp stack-overflow icc
我有一个int flags[(1<<20)]; 数组,似乎有问题,导致分段错误。这是堆栈溢出问题吗?我应该设置多少堆栈大小以及如何设置?
【问题讨论】:
标签: arrays gcc openmp stack-overflow icc
如果您的编程语言是 C++,则使用 std::vector,而不是 C 样式数组:
std::vector<int> flags(1<<20);
flags[0] = 1;
如果您的编程语言是C,请阅读 Lưu Vĩnh Phúc 的答案
【讨论】:
该大小的int 数组为 4MB。根据系统,这个数字可能很大也可能不大。在 x86 Linux 中,默认堆栈大小通常为 8-10MB,但在其他平台上可能会有所不同
在 Linux 中,您可以通过以下命令设置堆栈大小(以 KB 为单位)
ulimit -s 8192
但这会影响所有进程的堆栈大小,不推荐。要仅增加您自己进程的堆栈大小,然后use setrlimit
在 Windows stack size is set at link time 中,但同样,它应该只在必要的情况下增加
堆栈只能用于中小型变量。对于这么大的数组,你应该在堆上分配
int *flags = malloc((1 << 20)*sizeof(int));
使用后记得释放
【讨论】:
int *flags = malloc((1<<20) * sizeof *flags);
ulimit -s 仅更改主 OpenMP 线程的堆栈大小限制。其他 OpenMP 线程的堆栈大小由 OMP_STACKSIZE 环境变量控制 - 请参阅 here。