我如何强制gcc编译一个程序,在该程序中我声明一个比我的ram大的无符号整数数组 - 没有得到警告警告:“表达式中的整数溢出”?
例如。我有8GB的ram,我想要声明一个8.5gb的数组。
感谢大家,我发现问题不是数据类型,而是一些预处理器的东西。我花了很长一段时间。 :) 我写了
#define GIBI 1073741824
#define ARRAYSIZE 2*GIBI
显然编译器不喜欢这样。
答案 0 :(得分:5)
该错误消息并不是说你将会耗尽堆栈,尽管你会。它说这个数字太大而无法代表size_t
。确保您正在编译64位目标。
此外,不要这样做。如果需要分配大量的RAM,请使用malloc
,而不是堆栈。或者,更好的是mmap
。
答案 1 :(得分:5)
integer overflow in expression
不是堆栈溢出,这意味着GCC检测到表达式的结果导致了您分配给它的左值的整数溢出。例如,如果您尝试malloc
类INT_MAX * 2
之类的内容,则该表达式将导致整数溢出。如果你把它投射到size_t
,你应该没有警告:
void *myvar = malloc((size_t) INT_MAX * 2);
size_t
当然是依赖于平台的,如果您无法在{{1}中表示要分配的块的大小,那么 也会溢出比特。基本上,请确保您使用的是能够表示要分配的内存量的类型,并且它与sizeof(size_t)
兼容(因为这是size_t
所期望的,根据malloc()
)
答案 2 :(得分:0)
我很确定"integer overflow in expression"?
不意味着你正在溢出堆栈而是你正在做一些可能会溢出有符号整数的数学运算 Undefined行为即可。如果您粘贴警告所指的行,将会有所帮助。
答案 3 :(得分:0)
如果需要分配比RAM更多的内存,可以对内存映射文件进行一些研究。这样您就不必担心机器中的物理内存(无论如何都无法访问所有8GB)