我尝试编写以下内容:
#include <stdint.h>
#include <stdlib.h>
void *ptr = malloc(SIZE_MAX);
但是编译器给了我以下警告:
warning: argument 1 value ‘18446744073709551615’ exceeds maximum object
size 9223372036854775807 [-Walloc-size-larger-than=]
这听起来很合理。但是无论如何,我想在当前实现/架构上分配一个最大可能大小的对象。 RSIZE_MAX
中定义了一个宏Annex.B(19)
:
__STDC_WANT_LIB_EXT1__
RSIZE_MAX
所以我尝试了以下example:
#define __STDC_WANT_LIB_EXT1__
#include <stdint.h>
#include <stdlib.h>
int main(){
void *ptr = malloc(RSIZE_MAX);
}
但没有定义RSIZE_MAX
,但无效。如何在编译时使用此宏或其他任何方法来验证最大对象大小?
答案 0 :(得分:3)
定义SIZE_MAX
定义数据类型size_t
的最大值。数据类型size_t
可以存储任何对象的大小。最大大小取决于32位或64位的总线。
如果您尝试分配最大可计数大小的内存,则它一定会失败,因为这会阻塞您的整个地址空间。编译器会警告您malloc
调用将始终失败。要求的大小毫无意义。
BTW:9223372036854775807是0x7FFFFFFFFFFFFFFF
答案 1 :(得分:1)
RSIZE_MAX
在C11附件K中定义,这是可选的。支持它的实现将预定义宏__STDC_LIB_EXT1__
。例如,我在Ubuntu系统上使用的gcc / glibc实现不支持它,因此未定义RSIZE_MAX
。
在任何情况下,都无法保证malloc(RSIZE_MAX)
将成功,而且在标准中也没有任何暗示RSIZE_MAX
(即使已定义)是{{1}支持的最大分配大小}。评估malloc
甚至不是运行时约束; malloc(RSIZE_MAX+1)
仍采用类型malloc()
而不是size_t
的参数。 rsize_t
通过返回空指针来报告失败。
请参阅N1570 K.3.4:
宏是
malloc
扩展为类型为
RSIZE_MAX
的值。具有的功能 类型参数size_t
如果这些参数的值大于rsize_t
,则认为它是运行时约束冲突。
请注意,在某些系统(尤其是基于Linux的系统)上,RSIZE_MAX
似乎会成功,即使分配的内存不足,也会返回非null的结果。请参阅“过量使用”和“ OOM杀手”。