我正在尝试这样做:
int main(void){
u_int64_t NNUM = 2<<19;
u_int64_t list[NNUM], i;
for(i = 0; i < 4; i++){
list[i] = 999;
}
}
为什么我的Ubuntu 10.10 64位(gcc 4.6.1)会出现段错误?
答案 0 :(得分:5)
您尝试在堆栈上创建一个非常大的数组。这会导致堆栈溢出。
尝试在堆上分配数组。例如:
// Allocate memory
u_int64_t *list = malloc(NNUM * sizeof(u_int64_t));
// work with `list`
// ...
// Free memory again
free(list);
答案 1 :(得分:2)
您声明NNUM = 2*2^19 == 2<<19 == 1048576
。
并尝试在堆栈上分配64位* 1048576 =位数*单元格数。
它是8.5 MegaBytes
,它对于堆栈上的分配来说太多了,您可以尝试在堆上分配它,并使用malloc
的返回值检查它是否真的有用。
答案 2 :(得分:0)
您的程序要求最小堆栈大小为1048576, 如果你检查'ulimit -s',它很可能不到那个。 你可以尝试'ulimit -s 16384',然后再重新执行。