我遇到问题,我需要做一些大数据处理并创建太大的数组似乎导致Segmentation fault (core dumped)
。以下是问题的复制:
int main() {
struct { char a[2000][12] } b[2000];
return 0; }
我使用Archlinux 64位,cc
作为编译器,ulimit -s
返回8192
这很奇怪,因为我有24GB的RAM。知道如何解决这个问题吗?我认为这与stack
和heap
有关,但我不知道它们是什么。
答案 0 :(得分:1)
基本上,您尝试在堆栈上分配2000 * 12 * 2000/1024 = 46875 KB,但仅允许使用8192 KB。快速解决方法是设置Array
(
[0] => Array
(
[0] => myTemplate,
[1] => testArr => [1868,1869,1870],
[2] => testInteger => 3,
[3] => testString => 'test, can contain a comma'
)
)
。
简而言之,ulimit -s 50000
和stack
:stack是每个函数调用的私有内存(函数变量的内容所在的位置,即标量值,地址等) ,heap是一个公共内存,通常没有那么严格的限制(参见例如heap
)。
答案 1 :(得分:1)
ulimit -s
不返回总RAM大小。它只返回当前shell具有的可用堆栈大小(以及它可以创建的所有进程)。因此,可用的RAM大小并不重要。
您可以使用ulimit -s unlimited
增加它。但是我建议对这样的大型阵列使用动态内存分配,而不是你的阵列大小约为48MB,如果在堆栈上不可用,你很容易遇到麻烦,主要是因为"堆栈分配&# 34;失败很难被发现。
答案 2 :(得分:1)
通过使用局部变量声明数组来使用堆栈内存。使用堆内存分配:
typedef struct {
char a[2000][12];
} bigArray;
int main(void) {
bigArray *array;
array = (bigArray*)malloc(2000 * sizeof(bigArray));
// Do stuff with array here
free(array);
return 0;
}