u_int64_t数组

时间:2012-03-30 23:35:58

标签: c++ c segmentation-fault 64-bit

我正在尝试这样做:

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)会出现段错误?

3 个答案:

答案 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的返回值检查它是否真的有用。

heap VS. stack

答案 2 :(得分:0)

您的程序要求最小堆栈大小为1048576, 如果你检查'ulimit -s',它很可能不到那个。 你可以尝试'ulimit -s 16384',然后再重新执行。