【问题标题】:Can I allocate more than 65535 bytes according C standards?我可以根据 C 标准分配超过 65535 个字节吗?
【发布时间】:2012-04-11 15:51:42
【问题描述】:

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 个字节?

【问题讨论】:

标签: c malloc size-t


【解决方案1】:

SIZE_MAX 必须至少为 65535。如果您运行的是 MS-DOS 之类的东西,它实际上可能会那么小。在一台典型的、相当流行的台式计算机上(例如,任何不到 10 年的计算机),您可以预期它会更大,通常至少约为 40 亿(更准确地说是 232-1) .

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

【讨论】:

  • 但是 POSIX 定义说,limit,意思是最大限制。还有为什么他们将其定义为 65535?如果某些东西取决于数据类型的大小,通常标准不会指定这样的明确限制
  • @PavanManjunath:我不确定 POSIX 中的措辞,但在 C 标准中它说(§7.18.3/2):“其实现定义的值应等于或大于幅度(绝对值)比下面给出的相应值,具有相同的符号。”所以 65535 是允许的 最小值 值,而不是最大值。
  • @PavanManjunath:您只是误读了 POSIX。就像 C 一样,POSIX 定义了“最小最大值”,即允许实现强加为最大值的最小值。 POSIX 仍然允许SIZE_MAX 如此之小也可能是一个错误,因为(1)POSIX 现在要求int 至少为 32 位,并且(2)不可能在 64k 下实现 POSIX,更不用说有空间让应用程序运行。
【解决方案2】:

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

在大多数非嵌入式平台上,size_ttypedef 对应于 unsigned longSIZE_MAX 设置为 ULONG_MAX

【讨论】:

  • 你的意思是我应该在分配内存之前检查SIZE_MAX (malloc)?
  • 如果您使用的是32-bit64-bit 平台,我认为可以安全地假设SIZE_MAX 至少是UINT_MAX
  • @AmirSaniyan:这与您通常需要知道您的数据类型是否可以实际表示您想要放入其中的值一样,都不是问题。您不必检查任何东西本身,因为size_t 类型的变量将始终具有“有效”值,但当然您必须了解您是否溢出了任何东西。
【解决方案3】:

在 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 的值。

【讨论】:

  • 打印size_t的正确前缀是现代C语言中的z%zu%zx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多