125.C++中的size_t

发布时间 2023-08-03 19:05:57作者: CodeMagicianT

125.C++中的size_t

1.size_t

●size_t是一些C/C++标准在stddef.h中定义的,size_t类型表示C中任何对象所能达到的最大长度,它是无符号整数

●它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。size_t在32位系统上定义为 unsigned int,也就是32位无符号整型。在64位系统上定义为unsigned long,也就是64位无符号整形

●size_t 的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度

●size_t 在数组下标和内存管理函数之类的地方广泛使用。例如,size_t 用做sizeof操作符的返回值类型,同时也是很多函数的参数类型,包括malloc和strlen

●在声明诸如字符数或者数组索引这样的长度变量时用size_t是好的做法。它经常用于循环计数器、数组索引,有时候还用在指针算术运算上。size_t的声明是实现相关的。它出现在一个或多个标准头文件中,比如stdio.h 和stblib.h,典型的定义如下:

#ifndef __SIZE_T
#define __SIZE_T
typedef unsigned int size_t;
#endif

define 指令确保它只被定义一次。实际的长度取决于实现。通常在32 位系统上它的长度是32 位,而在64 位系统上则是64 位。一般来说,size_t 可能的最大值是SIZE_MAX。

打印size_t 类型的值时要小心。这是无符号值,如果选错格式说明符,可能会得到不可靠的结果。推荐的格式说明符是%zu。不过,某些情况下不能用这个说明符, 作为替代,可以考虑%u 或%lu。下面这个例子将一个变量定义为size_t,然后用两种不同的格式说明符来打印:

size_t sizet = -5;
printf("%d\n",sizet);
printf("%zu\n",sizet);

因为size_t 本来是用于表示正整数的,如果用来表示负数就会出问题。如果为其赋一个负数,然后用%d 和%zu 格式说明符打印,就得到如下结果:

-5
4294967291

%d把size_t当做有符号整数,它打印出-5 因为变量中存放的就是-5。%zu 把size_t 当做无符号整数。当-5 被解析为有符号数时,高位置为1,表示这个数是负数。当它被解析为无符号数时,高位的1 被当做2 的乘幂。所以在用%zu格式说明符时才会看到那个大整数。

sizet = 5;
printf("%d\n",sizet); // 显示5
printf("%zu\n",sizet); // 显示5

因为size_t是无符号的,一定要给这种类型的变量赋正数 。

2.size_t 和 int 比较

size_t在32位架构中定义为:typedef unsigned int size_t;
size_t在64位架构中被定义为:typedef unsigned long size_t;
size_t是无符号的,并且是平台无关的,表示0-MAXINT的范围;int为是有符号的;
int在不同架构上都是4字节,size_t在32位和64位架构上分别是4字节和8字节,在不同架构上进行编译时需要注意这个问题。
ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与 long int.

参考:C++ size_t