size_t 类型
size _t 为了增强程序的可移植性,便有了size_t ,不同系统上,定义size_t可能不一样。经测试发现,在32位系统中size_t是4字节的,在64位系统中,size_t是8字节的,这样利用该类型可以增加程序移植性。
size_t定义在/usr/include/linux/types.h,跟体系结构相关
<span style="font-family:SimSun;font-size:12px;">typedef _kernel_size_t size_t;</span>
而__kernel_size_t 定义在 /usr/include/asm/posix_types.h ,安装的是内核的源码
<span style="font-family:SimSun;font-size:12px;">asm-i386/posix_types.h
typedef unsigned int __kernel_size_t;
asm-1a64/posix_types.h
typedef unsigned long kernel_size_t;</span>
size_t是一种无符号的整型数,它的取值没有负数,在数组中也用不到负数,而它的取值范围是整型数的双倍。sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
size_t 的陷阱
程序:
<span style="font-family:SimSun;font-size:12px;">#include <stdio.h>
#include <string.h>
int main()
{
int i = -1;
if(i > strlen("Demon"))
printf("Hello World");
else
printf("Hello Demon");
return 0;
}</span>
输出的竟然是Hello World!-1 > 5?!
仔细想想,原来问题出在strlen上,strlen返回的类型是size_t,size_t的定义为:
<span style="font-family:SimSun;font-size:12px;">typedef unsigned int size_t;</span>
即无符号的整型,而i的类型是int,即有符号的整型。当有符号整型和无符号整型进行运算时,有符号整型会先自动转化成无符号。-1转化成无符号数为4294967295,远远大于5。