解析C语言中的sizeof程序员
1、sizeof的概念
sizeof是C语言的一种单目操做符,如C语言的其余操做符++、--等。它并非函数。sizeof操做符以字节形式给出了其操做数的存储大小。操做数能够是一个表达式或括在括号内的类型名。操做数的存储大小由操做数的类型决定。 数组
2、sizeof的使用方法
一、用于数据类型 函数
sizeof使用形式:sizeof(type) 指针
数据类型必须用括号括住。如sizeof(int)。 对象
二、用于变量 编译器
sizeof使用形式:sizeof(var_name)或sizeof var_name 编译
变量名能够不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带括号的用法更广泛,大多数程序员采用这种形式。 stream
注意:sizeof操做符不能用于函数类型,不彻底类型或位字段。不彻底类型指具备未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 变量
如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。 数据类型
3、sizeof的结果
sizeof操做符的结果类型是size_t,它在头文件
中typedef为unsigned int类型。该类型保证能容纳实现所创建的最大对象的字节大小。
一、若操做数具备类型char、unsigned char或signed char,其结果等于1。
ANSI C正式规定字符类型为1字节。
二、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,通常可能分别为二、二、二、二、四、四、四、八、10。
三、当操做数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。通常Unix的指针字节数为4。
四、当操做数具备数组类型时,其结果是数组的总字节数。
五、联合类型操做数的sizeof是其最大字节成员的字节数。结构类型操做数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
让咱们看以下结构:
struct {char b; double x;} a;
在某些机器上sizeof(a)=12,而通常sizeof(char)+ sizeof(double)=9。
这是由于编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。
六、若是操做数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
4、sizeof与其余操做符的关系
sizeof的优先级为2级,比/、%等3级运算符优先级高。它能够与其余操做符一块儿组成表达式。如i*sizeof(int);其中i为int类型变量。
5、sizeof的主要用途
一、sizeof操做符的一个主要用途是与存储分配和I/O系统那样的例程进行通讯。例如:
void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
二、sizeof的另外一个的主要用途是计算数组中元素的个数。例如:
void * memset(void * s,int c,sizeof(s))。
6、建议 因为操做数的字节数在实现时可能出现变化,建议在涉及到操做数字节大小时用sizeof来代替常量计算