1

我如何强制 gcc 编译一个程序,在该程序中我声明一个比我的内存大的无符号整数数组 - 没有得到警告警告:“表达式中的整数溢出”?

例如。我有 8gb 的内存,我想声明一个 8.5gb 的数组。

编辑:

谢谢大家,我发现问题不在于数据类型,而在于一些预处理器。我花了很长时间。:) 我写

#define GIBI 1073741824
#define ARRAYSIZE 2*GIBI

显然编译器不喜欢那样。

4

4 回答 4

5

该错误消息并不是说您将用完堆栈,尽管您会。就是说这个数字太大了,无法表示size_t。确保您正在为 64 位目标进行编译。

此外,不要那样做。如果您需要分配大量 RAM,请使用malloc,而不是堆栈。或者,更好的是,使用mmap.

于 2010-12-14T20:27:16.857 回答
5

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)。

于 2010-12-14T20:30:48.507 回答
0

我相当确定这"integer overflow in expression"?并不意味着您正在溢出堆栈,而是您正在做一些可能会溢出Undefined Behavior的有符号整数的数学运算。如果您粘贴警告所指的行会有所帮助。

于 2010-12-14T20:26:33.827 回答
0

如果您需要分配比 RAM 更多的内存,您可以对内存映射文件进行一些研究。这样您就不必担心机器中的物理内存(无论如何您都无法访问所有 8GB)

http://msdn.microsoft.com/en-us/library/dd997372.aspx

于 2010-12-14T20:31:48.933 回答