问题描述
C标准保证了为size_t
是一个可以持有任何数组索引类型。这意味着,从逻辑上讲,为size_t
应该可以持有任何指针类型。我读过一些网站,我在谷歌发现,这是合法的和/或应始终工作:
无效* V =的malloc(10);
为size_t S =(为size_t)V;
于是在C99,该标准引入了使用intptr_t
和 uintptr_t形式
类型,这是符号和无符号类型保证要能容纳指针:
uintptr_t形式P =(为size_t)V;
那么究竟是什么两者的区别:为size_t
和 uintptr_t形式
?两者都是无符号的,都应该能够举办任何指针类型,因此他们似乎功能上完全相同。是否有任何真正令人信服的理由使用 uintptr_t形式
(或更好,但一个无效*
)而不是为size_t
,比其他的清晰度?在一个不透明的结构,其中区域将仅由内部功能来处理,没有任何理由不这样做呢?
同样, ptrdiff_t的
一直能够保持指针的差异,因此能够容纳几乎所有的指针已签名的类型,所以它是如何不同于使用intptr_t
?
是不是所有这些类型的服务基本上平凡的不同版本的同一功能的呢?如果不是,为什么?我可以用其中的一个,我不能与其他做不?如果是这样,为什么C99中添加两个本质上多余类型的语言?
我愿意不顾函数指针,因为他们并不适用于当前的问题,但随时提他们,因为我有一个偷渡怀疑他们将中央的正确的答案。
Not necessarily! Hark back to the days of segmented 16-bit architectures for example: an array might be limited to a single segment (so a 16-bit size_t
would do) BUT you could have multiple segments (so a 32-bit intptr_t
type would be needed to pick the segment as well as the offset within it). I know these things sound weird in these days of uniformly addressable unsegmented architectures, but the standard MUST cater for a wider variety than "what's normal in 2009", you know!-)
这篇关于为size_t主场迎战使用intptr_t的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!