gpt4 book ai didi

c - 为什么 offsetof 返回 size_t 而不是 uintptr_t?

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:48 25 4
gpt4 key购买 nike

我注意到我对 offsetof 的实现:

#define offsetof(st, m) ((size_t)&(((st *)0)->m))

返回一个 size_t,但我认为它应该是 uintptr_t,因为 offsetof 的值最有可能用于递增指针。

我有这个功能:

int flash_seek(intptr_t offset32, int whence);

它将FLASH的内部指针移动到另一个位置。所以 offset32 是一个偏移量。如果我想将指针从结构的偏移量移开:

flash_seek(offsetof(foo_t, bar), SEEK_CUR);

我收到警告是因为 uintptr_tsize_t 的类型不同。如果我不想添加类型转换,应该如何更正此问题?

最佳答案

size_t 是一种无符号整数类型,可以容纳系统上最大对象的大小。

这使得它成为保存系统中可能是最大结构中最后一个成员的偏移量的完美候选者。

它还需要在任何符合 C 标准库的实现上定义。 uintptr_t 是可选的。

uintptr_t 还设计用于保存转换为整数值的地址。它是为了保存一个绝对位置,而不是某个未指定位置的偏移量。此外,该标准对如何完成 address->integral value->address 之间的映射没有强加任何要求。只要求两端地址相同即可。

为什么 的答案主要归结为 size_tuintptr_t 是完全不同事物的抽象,前者是必需的 待定义。

关于c - 为什么 offsetof 返回 size_t 而不是 uintptr_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43065752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com