什么时候应该使用intptr_t
和size_t
数据类型?
在32位平台上,intptr_t
和size_t
都设置为32位。在64位平台上,它们设置为64位。有没有使用指南?
当我们将其与printf
一起使用时,POSIX表示对%z
使用size_t
,对PRIdPTR
使用intptr_t
。在尝试打印%z
时,我们可以使用PRIdPTR
代替intptr_t
吗?
答案 0 :(得分:3)
如果要将指针存储在整数类型中,则应使用intptr_t
。从历史上看,人们常常使用int
来做这件事,但这不是一个好习惯,因为指针通常比int
大,所以你会丢失信息; intptr_t
或uintptr_t
保证能够保持指针。如果你想要某种类型的元素的大小或数量,你应该使用size_t
;这是sizeof
的结果,通常用于索引连续容器类型,如数组或std::vector
。通常,它们在引擎盖下将是相同的类型(签名除外),但在具有例如segmented memory的平台上无法保证,其中类型只占用可用内存的一小部分。
你很少想要将指针存储在整数类型中;将它留作指针通常要好得多,所以你可能不想非常使用intptr_t
或uintptr_t
。但是,您经常想知道事物的大小,或索引数组或标准容器,因此您应该相对经常使用size_t
。
答案 1 :(得分:3)
何时使用
intptr_t
,size_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_t
与size_t
的类型相同,则使用%zu
打印它将成功。但它仍然是错误的,不能保证这些类型在所有平台上都是一样的。