32/64位平台上的intptr_t和size_t

时间:2017-08-17 15:29:14

标签: c

什么时候应该使用intptr_tsize_t数据类型?

在32位平台上,intptr_tsize_t都设置为32位。在64位平台上,它们设置为64位。有没有使用指南?

当我们将其与printf一起使用时,POSIX表示对%z使用size_t,对PRIdPTR使用intptr_t。在尝试打印%z时,我们可以使用PRIdPTR代替intptr_t吗?

3 个答案:

答案 0 :(得分:3)

如果要将指针存储在整数类型中,则应使用intptr_t。从历史上看,人们常常使用int来做这件事,但这不是一个好习惯,因为指针通常比int大,所以你会丢失信息; intptr_tuintptr_t保证能够保持指针。如果你想要某种类型的元素的大小或数量,你应该使用size_t;这是sizeof的结果,通常用于索引连续容器类型,如数组或std::vector。通常,它们在引擎盖下将是相同的类型(签名除外),但在具有例如segmented memory的平台上无法保证,其中类型只占用可用内存的一小部分。

你很少想要将指针存储在整数类型中;将它留作指针通常要好得多,所以你可能不想非常使用intptr_tuintptr_t。但是,您经常想知道事物的大小,或索引数组或标准容器,因此您应该相对经常使用size_t

答案 1 :(得分:3)

  

何时使用intptr_tsize_t数据类型?

size_t始终可用 - 它是C语言的一部分。它是一些 unsigned 类型,可用于索引数组和执行大小计算。它是索引的最佳宽度整数,因为它从不太窄也不过宽。

代码可以使用printf("%zu\n", some_size_t);进行打印。

(u)intptr_t可选地通常实施。它们是C标准库的一部分。它们是能够往返对象指针的整数类型object * - > void * - > intptr_t - > void * - > object *,结果指针等于原始指针。

代码可以使用printf( "%" PRIdPTR "\n", some_intptr_t);进行打印。

  

在尝试打印intptr_t时,我们可以使用%z而不是PRIdPTR吗?

这不适用于便携式代码。除了符号的不同之外,遇到整数宽度不同的实现是合理的,intptr_t可能更宽或宽size_t

答案 2 :(得分:3)

首先,你不应该关心一个类型有多少位(至少一般来说)。将这些类型用于预期用途,您的代码将非常便携。

使用size_t表示与对象大小相关的任何内容。这包括例如索引数组。

intptr_t的用法非常少见,但只要您需要将指针值存储在有符号整数中,就可以使用它们。通常,无符号整数是更好的选择,然后您可以使用uintptr_t。大多数情况下,您不需要以整数存储指针,只能使用.....指针类型。

对于打印,%z不是转换说明符。 z是适合size_t大小的长度修饰符。由于size_t未签名,因此您需要%zu。另请注意,PRIdPTR宏会扩展为应与%连接的内容,以使其成为完整的转换说明符。它只包含类型说明符和必要的长度修饰符。

当然,如果您知道 uintptr_tsize_t的类型相同,则使用%zu打印它将成功。但它仍然是错误的,不能保证这些类型在所有平台上都是一样的。