本文介绍了为size_t主场迎战使用intptr_t的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-20 10:05