对象宏的最大大小

时间:2019-04-04 08:19:31

标签: c macros stdint

我尝试编写以下内容:

#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,但无效。如何在编译时使用此宏或其他任何方法来验证最大对象大小?

2 个答案:

答案 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杀手”。