我可以根据C标准分配超过65535个字节吗?

时间:2012-04-11 15:51:42

标签: c malloc size-t

malloc定义如下:

void *malloc(size_t size);

http://pubs.opengroup.org/onlinepubs/009695399/functions/malloc.html


size_t定义(stddef.h):

size_t: Unsigned integer type of the result of the sizeof operator. http://pubs.opengroup.org/onlinepubs/009604499/basedefs/stddef.h.html


但根据此页面,size_t的最大限制为65535。 (其他整数类型的部分限制):

size_t的限制:SIZE_MAX 65535 http://pubs.opengroup.org/onlinepubs/007904975/basedefs/stdint.h.html


这是否意味着当我想尊重C标准时,我不能分配超过65535个字节?

3 个答案:

答案 0 :(得分:7)

SIZE_MAX必须至少为65535.如果您正在运行类似MS-DOS的东西,那么实际上它甚至可能会那么小。在典型的,当前合理的台式计算机上(例如,任何不到10年的任何东西),您可以预期它会更大,通常至少大约40亿(2 32 -1,更确切地说)

是否需要(尝试)处理更有限的系统将取决于您可能关心移植代码的目标范围。如果你真的需要在一个系统上处理一个16位编译器,而这个系统的可寻址内存少于1兆字节,那么你必须记住你的代码。然而,老实说,对于大多数人来说,这根本就是无关紧要的 - 即使是相对较小的便携式系统(例如iPod)也可以解决比以往更多的内存。 OTOH,如果你正在为唱歌贺卡编写代码,那么是的,这种限制可能来自领土(但在这种情况下,标准通常被视为一般指导而非绝对法则)。

答案 1 :(得分:3)

SIZE_MAX的最小值是65535但它可以(通常是)更多。

在大多数非嵌入式平台上,size_t typedefunsigned longSIZE_MAX设置为ULONG_MAX

答案 2 :(得分:1)

在32位平台上,SIZE_MAX通常为2 ^ 32 - 1,在64位平台上为2 ^ 64 - 1.如果不确定,请检查printf。

printf("sizeof size_t = %zx, SIZE_MAX = %zx\n", sizeof(size_t), SIZE_MAX);

包含stdint.h以获取SIZE_MAX的值。