size_t和ptrdiff_t类型的变量

时间:2011-10-31 16:43:37

标签: c++ c size-t

通过阅读与size_tptrdiff_t相关的在线信息,我想确认以下内容:

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

  2. 如果我想声明一个可以表示来自另一个指针的偏移量的变量,我最好将其声明为ptrdiff_t类型?

  3. 如何在C和C ++中输出size_tptrdiff_t类型的变量?以下是正确的:Cross platform format string for variables of type size_t?

  4. uintptr_t只是size_t的另一个名称,或者它应该作为size_t的单独类型使用?

  5. ssize_t intptr_t ptrdiff_t的其他名称还是必须以不同的方式使用?

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

    ADDed:我确实希望能够使用否定偏移量。使用uintptr_tintptr_t的任何差异?

3 个答案:

答案 0 :(得分:19)

  

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

sizeof(size_t) <= sizeof(prtdiff_t)就是这种情况。在合理的实施中将是这种情况,但不能保证。

  

2:如果我想声明一个可以表示来自另一个指针的偏移量的变量,我最好将其声明为类型ptrdiff_t

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

  

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

在C:

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

在C ++中:

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

4:uintptr_tsize_t的另一个名称还是应该用作size_t的单独类型?

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

  

5:ssize_t intptr_tptrdiff_tssize_t的另一个名称还是必须以不同的方式使用?

就C或C ++语言而言,

ptrdiff_t不是标准类型;它由Posix定义为一些函数参数和返回值的类型。除了直接处理Posix函数外,最好使用intptr_t

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

  

我确实希望能够使用负偏移量。使用intptr_tptrdiff_t的任何差异?

不要使用这些类型中的任何一种来表示偏移;使用{{1}}。在特殊情况下,如果由于某种原因想要将指针转换为整数表示,请使用这些类型。

答案 1 :(得分:1)

uintptr_tintptr_t足以容纳任何void*指针值而不会丢失信息。它们需要能够唯一地表示程序整个地址空间中任何对象的地址 - 包括任何对象中的任何字节。

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

大多数当前系统都有一个单片地址空间,但C设计用于不能处理的系统。例如,在某些系统上,最大可能的对象可能只是整个地址空间大小的一小部分 - 并且比较或减去指向不同对象的指针可能毫无意义。 (考虑一种分段寻址方案,其中指针减法和比较只考虑地址的偏移部分。)

答案 2 :(得分:0)

假设_ptrdiff_t_是拼写错误:

1)是的。如果数组的最大大小小于SIZE_MAX/2,您可以安全地使用ptrdiff_t
2)有时候:ptrdiff_t通常是两个指针之间的差异,而size_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