20

size_t通过阅读与和相关的在线帖子ptrdiff_t,我想确认以下内容:

  1. 如果数组的最大大小小于1/2*(max number represent-able by size_t),我可以安全地使用ptrdiff_t并检查指向同一对象的两个指针之间的相对距离吗?(因为我在谈论数组,“指向同一对象的指针”意味着“指向同一数组的指针”) .

  2. 如果我想声明一个可以表示与另一个指针的偏移量的变量,我最好将它声明为 type ptrdiff_t

  3. 如何在 C 和 C++ 中输出类型size_t和变量?ptrdiff_t以下是否正确:size_t 类型变量的跨平台格式字符串?

  4. isuintptr_t只是size_tOR 的另一个名称,它应该用作独立于size_t?的类型

  5. isssize_t和OR 的intptr_t另一个名称ptrdiff_t必须以不同的方式使用?

我开始在 Ubuntu 上使用 gcc。我刚刚在使用别人的代码时发现了这些类型。

添加:我确实希望能够使用偏移量。uintptr_t和使用有什么区别intptr_t吗?

4

3 回答 3

20

1:如果数组的最大大小小于 1/2*(可表示的最大数量size_t),我可以安全地使用ptrdiff_t并检查指向同一对象的两个指针之间的相对距离吗?

如果sizeof(size_t) <= sizeof(prtdiff_t). 在合理的实施中会出现这种情况,但不能保证。

2:如果我想声明一个可以表示与另一个指针的偏移量的变量,我最好将它声明为 type ptrdiff_t

是的,这就是该类型的用途。

3:如何在C和C++中输出size_t和ptrdiff_t类型的变量?

在 C 中:

printf("%zu %td\n", size, ptrdiff);

在 C++ 中:

std::cout << size << ' ' << ptrdiff << '\n';

4:isuintptr_t只是size_tOR 的另一个名称,它应该用作与size_t?的单独类型。

它应该被视为一个单独的类型。uintptr_t是一个整数类型,可以包含任何转换为​​整数的指针值;它可能在某些平台上不存在。

5:是ssize_tintptr_t花药的名称ptrdiff_t还是它必须以不同的方式使用?

ssize_t就 C 或 C++ 语言而言,它不是标准类型;它被 Posix 定义为一些函数参数和返回值的类型。ptrdiff_t除非直接处理 Posix 函数,否则最好使用它。

intptr_t用于保存指针的整数表示,而不是指针之间的差异。在某些平台上,它们可能具有不同的大小,并且intptr_t可能根本没有定义,因此它们不应互换使用。

我确实希望能够使用负偏移量。uintptr_t和使用有什么区别intptr_t吗?

不要使用这两种类型中的任何一种来表示偏移量;使用ptrdiff_t. 在特殊情况下使用这些类型,当您出于某种原因要将指针转换为其整数表示时。

于 2011-10-31T17:02:26.300 回答
1

uintptr_t并且intptr_t足够大以保存任何void*指针值而不会丢失信息。它们需要能够在程序的整个地址空间中唯一地表示任何对象的地址——包括任何对象中的任何字节。

size_t是运算符产生的类型sizeofptrdiff_t是通过减去两个指针产生的类型。它们只需要足够大以容纳单个对象。(并且可能有一个对象如此之大,以至于减去指向相反两端的两个指针会溢出。)

大多数当前系统都有一个单一的整体地址空间,但 C 旨在在没有的系统上工作。例如,在某些系统上,最大的可能对象可能只是整个地址空间大小的一小部分——比较或减去指向不同对象的指针可能没有意义。(考虑一个分段寻址方案,其中指针减法和比较只考虑地址的偏移部分。)

于 2011-10-31T21:04:05.457 回答
0

假设_ptrdiff_t_是一个错字:

1) 是的。如果数组的最大大小小于SIZE_MAX/2,您可以安全地使用ptrdiff_t
2) 有时:ptrdiff_t通常是两个指针之间的差异,whilesize_t是偏移量。这里重要的size_t是总是积极的,ptrdiff_t可能是消极的。请注意,在某些平台上,它们的大小可能大不相同。
3)您输出类型的变量size_tptrdiff_t输出任何其他变量类型的方式相同。

size_t a = 10;
ptrdiff_t b = 20;
printf("%u %d", ((unsigned int)a), ((int)b));
std::cout << a << b;

4)uintptr_t是一个至少与 一样大的无符号整数int*,以安全地允许指针上的整数数学运算。 size_t据我所知,不保证相同。
5)ssize_t是非标准的 C 类型,对应于ptrdiff_t. 改为使用ptrdiff_t。( On platforms supporting the POSIX 1003.1-1996 API standard, which includes most Unix-like systems, a signed variant of size_t named ssize_t is available, which was not part of the ANSI or ISO C standards. http://en.wikipedia.org/wiki/Size_t )

于 2011-10-31T16:54:19.233 回答