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