整数[2²⁰] 数组导致 OpenMP 分段错误



我有一个int flags[(1<<20)];数组,似乎有问题,它导致了分段错误。这是堆栈溢出问题吗?我应该设置多少堆栈大小以及如何设置?

如果你的编程语言是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

但这会影响所有进程的堆栈大小,不建议这样做。要仅增加您自己的进程的堆栈大小,请使用setrlimit

Windows中,堆栈大小是在链接时设置的,但同样,它应该只在必要的情况下增加

堆栈只能用于中小型变量。对于如此大的数组,您应该在堆上分配

int *flags = malloc((1 << 20)*sizeof(int));

并记得在使用后释放它

最新更新