通过阅读与size_t
和ptrdiff_t
相关的在线信息,我想确认以下内容:
如果数组的最大大小小于1/2*(max number represent-able by size_t)
,我可以安全地使用ptrdiff_t
并检查指向同一对象的两个指针之间的相对距离吗?(因为我在谈论数组,“指向同一对象的指针”的意思是“指向同一个数组的指针”。
如果我想声明一个可以表示来自另一个指针的偏移量的变量,我最好将其声明为ptrdiff_t
类型?
如何在C和C ++中输出size_t
和ptrdiff_t
类型的变量?以下是正确的:Cross platform format string for variables of type size_t?
uintptr_t
只是size_t
的另一个名称,或者它应该作为size_t
的单独类型使用?
是ssize_t
和 intptr_t
ptrdiff_t
的其他名称还是必须以不同的方式使用?
我开始在Ubuntu上使用gcc。我在使用某人时发现了这些类型 别的代码。
ADDed:我确实希望能够使用否定偏移量。使用uintptr_t
和intptr_t
的任何差异?
答案 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_t
是size_t
的另一个名称还是应该用作size_t
的单独类型?
它应该被视为一种单独的类型。 uintptr_t
是一个整数类型,可以包含转换为整数的任何指针值;它可能在某些平台上不存在。
就C或C ++语言而言,5:
ssize_t
intptr_t
和ptrdiff_t
是ssize_t
的另一个名称还是必须以不同的方式使用?
ptrdiff_t
不是标准类型;它由Posix定义为一些函数参数和返回值的类型。除了直接处理Posix函数外,最好使用intptr_t
。
intptr_t
用于保存指针的整数表示,而不是指针之间的差异。在某些平台上,这些可能具有不同的大小,uintptr_t
可能根本没有定义,因此它们不应互换使用。
我确实希望能够使用负偏移量。使用
intptr_t
和ptrdiff_t
的任何差异?
不要使用这些类型中的任何一种来表示偏移;使用{{1}}。在特殊情况下,如果由于某种原因想要将指针转换为整数表示,请使用这些类型。
答案 1 :(得分:1)
uintptr_t
和intptr_t
足以容纳任何void*
指针值而不会丢失信息。它们需要能够唯一地表示程序整个地址空间中任何对象的地址 - 包括任何对象中的任何字节。
size_t
是sizeof
运算符产生的类型; ptrdiff_t
是通过减去两个指针而产生的类型。它们只需要足够大以容纳单个对象。 (并且可能有一个如此大的对象,减去指向相反端的两个指针将溢出。)
大多数当前系统都有一个单片地址空间,但C设计用于不能处理的系统。例如,在某些系统上,最大可能的对象可能只是整个地址空间大小的一小部分 - 并且比较或减去指向不同对象的指针可能毫无意义。 (考虑一种分段寻址方案,其中指针减法和比较只考虑地址的偏移部分。)
答案 2 :(得分:0)
假设_ptrdiff_t_
是拼写错误:
1)是的。如果数组的最大大小小于SIZE_MAX/2
,您可以安全地使用ptrdiff_t
2)有时候:ptrdiff_t
通常是两个指针之间的差异,而size_t
是一个偏移量。这里重要的是size_t
总是积极的,ptrdiff_t
可能是否定的。请注意,在某些平台上,它们的大小可能大不相同
3)输出类型size_t
和ptrdiff_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)