0

我试图写以下内容:

#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

所以我尝试了以下示例

#define __STDC_WANT_LIB_EXT1__
#include <stdint.h>
#include <stdlib.h>

int main(){
    void *ptr = malloc(RSIZE_MAX);
}

但是没有效果,RSIZE_MAX没有定义。如何在编译时使用此宏或任何其他方式来验证最大对象大小?

4

2 回答 2

3

定义SIZE_MAX定义了数据类型的最大值size_t。数据类型size_t能够存储任何对象的大小。最大大小取决于 32 位或 64 位的总线。

如果您尝试分配最大可数内存大小的内存,它一定会失败,因为这会阻塞您的整个地址空间。编译器会警告您malloc调用将始终失败。请求的大小没有任何意义。

顺便说一句:9223372036854775807 是 0x7FFFFFFFFFFFFFFF

于 2019-04-04T08:29:35.037 回答
1

RSIZE_MAX在 C11 附录 K 中定义,它是可选的。支持它的实现将预定义宏__STDC_LIB_EXT1__。例如,我在 Ubuntu 系统上使用的 gcc/glibc 实现不支持它,因此没有定义RSIZE_MAX.

在任何情况下,都不能保证malloc(RSIZE_MAX)一定会成功,标准中也没有任何暗示RSIZE_MAX,即使它已定义,也是malloc. 评估malloc(RSIZE_MAX+1)甚至不是运行时约束违规malloc()仍然需要类型的参数size_t,而不是rsize_tmalloc通过返回空指针报告失败。

N1570 K.3.4:

宏是

RSIZE_MAX

它扩展为 type 的值size_trsize_t如果这些参数的值大于,则具有类型参数的函数将其 视为违反运行时约束RSIZE_MAX

请注意,在某些系统(尤其是基于 Linux 的系统)malloc()上,即使没有足够的内存可用于分配,它也可能看起来成功,返回非空结果。请参阅“过度使用”和“OOM 杀手”。

于 2019-04-04T18:46:12.980 回答