https://blog.csdn.net/bzhxuexi/article/details/19899803 size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。 size_t的真实类型与操作系统有关,在32位架构中被普遍定义为: typedef unsigned int size_t; 而在64位架构中被定义为:
typedef unsigned long size_t;
size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构上进行编译时需要注意这个问题。
而int在不同架构下都是4字节,与size_t不同;且int为带符号数,size_t为无符号数。 size_t是无符号的,并且是平台无关的,表示0-MAXINT的范围; int是有符号的; 具体可参考:http://123.125.115.53/view/3236587.htm ---------------------------------------ssize_t------------------------------------------------------------ ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int,有没有注意到,它和long数据类型有啥区别?其实就是一样的。size_t 就是无符号型的ssize_t,也就是unsigned long/ unsigned int (在32位下),不同的编译器或系统可能会有区别,主要是因为在32位机器上int和long是一样的。 typedef long ssize_t;//ssize_t就是long类型 -----------------------------------size_t和ssize_t---------------------------------------------- size_t是什么类型的? 解释一:为了增强程序的可移植性,便有了size_t,它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。 在32位系统上 定义为 unsigned int 也就是说在32位系统上是32位无符号整形。在64位系统上定义为 unsigned long 也就是说在64位系统上是64位无符号整形。size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小。 它的意义大致是“适于计量内存中可容纳的数据项目个数的无符号整数类型”。所以,它在数组下标和内存管理函数之类的地方广泛使用。而ssize_t这个数据类型用来表示可以被执行读写操作的数据块的大小.它和size_t类似,但必需是signed.意即:它表示的是signed size_t类型的。 typedef unsigned long size_t 解释二:ssize_t是signed size_t。 size_t是标准C库中定义的,应为unsigned int。定义为typedef int ssize_t。 而ssize_t:这个数据类型用来表示可以被执行读写操作的数据块的大小.它和size_t类似,但必需是signed.意即:它表示的是sign size_t类型的。 《Unix 高级环境编程》里面是这么说的:
原始系统数据类型 ============================================================= C语言中size_t的陷阱 今天写了一个类似这样的程序:
输出的竟然是Hello World!-1 > 5?! 仔细想想,原来问题出在strlen上,strlen返回的类型是size_t,size_t的定义为:
即无符号的整型,而i的类型是int,即有符号的整型。当有符号整型和无符号整型进行运算时,有符号整型会先自动转化成无符号。-1转化成无符号数为4294967295,远远大于5。 今后遇到有符号数和无符号数之间的运算时要千万小心。 参考:http:///programming/c-size_t-pitfall.html |
|
来自: XeonGate > 《Ubuntu 18.04.3》