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

now*_*wox 0 c pointers c99

我注意到我对offsetof的实现:

#define offsetof(st, m) ((size_t)&(((st *)0)->m))
Run Code Online (Sandbox Code Playgroud)

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

我有这个功能:

int flash_seek(intptr_t offset32, int whence);
Run Code Online (Sandbox Code Playgroud)

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

flash_seek(offsetof(foo_t, bar), SEEK_CUR);
Run Code Online (Sandbox Code Playgroud)

我得到一个警告,因为uintptr_t它的类型不一样size_t.如果我不想添加演员,我该如何纠正?

Sto*_*ica 7

size_t 是一种无符号整数类型,可以保存系统中最大对象的大小.

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

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

A uintptr_t还用于保存转换为整数值的地址.这是保持绝对位置,而不是偏离某些未指定的位置.此外,该标准没有要求如何进行映射address->integral value->address.它只要求两端的地址相同.

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

  • 关于`uintptr_t`的另一点是它只能保证指针的整数转换.C标准没有任何地方保证指针必须是一个整数,只有转换为整数然后再返回才能保留该值. (3认同)