c - 对象宏的最大大小

标签 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=]

这听起来很有道理。但无论如何,我想在当前实现/arch 上分配一个最大可能大小的对象。 Annex.B(19) 中定义了宏RSIZE_MAX:

__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 没有定义。如何使用此宏或任何其他方式在编译时验证最大对象大小?

最佳答案

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

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

顺便说一句:9223372036854775807 是 0x7FFFFFFFFFFFFFFFF

关于c - 对象宏的最大大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55511064/

相关文章:

c - 任意浮点精度数到字符串

macros - 为什么这个宏被替换为 20 而不是 10?

c++ - 如何将任意代码块作为参数传递给 C 宏

c - 如何将 valgrind 与实际上是宏扩展的函数一起使用

C 类型声明 intN_t

c - 为什么 int_fast16_t 在 64 位系统上是 64 位?

C程序在windows下用cygwin编译成功,在linux下出现segmentation fault。 cygwin GCC 是 'bad' 吗?

将数组整数值与移位值进行比较

c - "Wrapping"一个 C 字符数组,每 x 个字符放入 '\n'——strcat 问题

c - 为什么数组的最大大小是 "too large"?