C语⾔第⼗七篇:size_t数据类型
size_t 类型表⽰C 中任何对象所能达到的最⼤长度。它是⽆符号整数,因为负数在这⾥没有意义。它的⽬的是提供⼀种可移植的⽅法来声明与系统中可寻址的内存区域⼀致的长度。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 可以⽤来存放指针,但是假定size_t 和指针⼀样长不是个好主意。稍后的“使⽤sizeof 操作符和指针”会讲到,intptr_t 是更好的选择。
打印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 是⽆符号的,⼀定要给这种类型的变量赋正数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论