无符号64位整数数组

3
我正在尝试做以下事情:
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)会遇到段错误(segfault)?


8
关于StackOverflow的StackOverflow... :)(说明:这是一种对StackOverflow网站本身的讨论,而非具体问题的翻译。) - Mysticial
正确的名称是uint64_t,而不是u_int64_t。后者是一个遗留名称,在标准C中不存在,并且仅在POSIX sys/types.h中保留以与旧软件兼容。 - R.. GitHub STOP HELPING ICE
3个回答

5

您试图在堆栈上创建一个非常大的数组,这会导致堆栈溢出。

尝试在堆上分配数组,例如:

// Allocate memory
u_int64_t *list = malloc(NNUM * sizeof(u_int64_t));

// work with `list`
// ...

// Free memory again
free(list);

你说的堆是什么意思?抱歉我不太懂 :) - Frederico Schardong
你可以通过将其声明为全局变量(在main()之外声明)或将其声明为static(使其保持在main()内部)来实现这一点。 - tomlogic
或者通过使用malloc分配数组。 - Lawrence Velázquez
在主函数内部没有办法做这样的事情吗?u_int64_t NNUM = 2<<19; 静态的u_int64_t list[NNUM]; - Frederico Schardong
@FredericoSchardong 这是tomlogic提出的第二个建议。 - Lawrence Velázquez
@LawrenceVelázquez 我之所以问是因为gcc返回:错误:‘list’的存储大小不是常量。 - Frederico Schardong

2
你声明了NNUM = 2*2^19 == 2<<19 == 1048576
并尝试在栈上分配64位 * 1048576 = 位数 * 单元格数。 这是8.5兆字节,对于在栈上分配来说太多了,你可以尝试在堆上分配,并使用malloc的返回值来检查是否确实有效。 堆VS.栈

0

你的程序需要至少1048576的最小堆栈大小, 如果你使用'ulimit -s'检查,很可能比这个要小。 你可以尝试使用'ulimit -s 16384',然后重新执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接