1.sizeof概念
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数,而是关键字。sizeof操作符以字节形式给出了其操作数的存储大小。
注意:
2.sizeof使用
(1)用于数据类型
sizeof使用形式: sizeof(datatype)
数据类型必须用括号括住: sizeof(int)
(2)用于变量
sizeof使用形式: sizeof(var_name) 或 sizeof var_name
a.变量名可以不用括号括住.如sizeof (var_name),sizeof var_name等都是正确形式带括号的用法更普遍,大多数程序员采用这种形式。
b.
3.常用数据类型sizeof结果(linuxv2.6)
(1)ANSI C正式规定字符类型为1字节。
sizeof(char) = 1;
sizeof(unsigned char) = 1;
sizeof(signed char) = 1;
(2)其他类型在ANSI C中没有具体规定,大小依赖于实现。
sizeof(int) = 4;
sizeof(unsigned int) = 4;
sizeof(short int) = 2;
sizeof(unsigned short) = 2;
sizeof(long int) = 4;
sizeof(unsigned long) = 4;
sizeof(float) = 4;
sizeof(double) = 8;
sizeof(long double) = 12;
(3)当操作数是指针时,sizeof依赖于编译器。
Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。
一般Unix/Linux的指针字节数为4。
例如: char *p; //Linux
sizeof(p) = 4;
(4)当操作数具有数组类型时,其结果是数组的总字节数。
例如: char a[5];
int b[5];
sizeof(a) = 5;
sizeof(b) = 20;
(5)当操作数是具体的字符串或者数值时,会根据具体的类型进行相应转化。
例如: sizeof(8) = 4; //自动转化为int类型
sizeof(8.8) = 8; //自动转化为double类型,注意,不是float类型
sizeof("ab") = 3 //自动转化为数组类型,
//长度是4,不是3,因为加上了最后的'\n'符
//有资料说,会自动转化为指针类型(Linux为4)
//可能和操作系统与编译器有关系
(6)当操作数是联合类型时,sizeof是其最大字节成员的字节数。
当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。
(7)当操作数是函数中的数组形参或函数类型的形参:
sizeof给出其指针的大小,Linux中值为4。
4.sizeof与数据结构
double d;
char ch;
int data;
}stra;
struct str_b{
char ch;
double d;
int data;
}strb;
两个不同的结构,但是内部的元素是相同的,都是double,int,char,只是顺序不一样,就导致结果不一样。why?
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
偏移量必须为sizeof(char)即1的倍数
偏移量必须为sizeof(int)即4的倍数
偏移量必须为sizeof(float)即4的倍数
偏移量必须为sizeof(double)即8的倍数
偏移量必须为sizeof(short)即2的倍数
5.sizeof与strlen()
sizeof和strlen()都可以用来计算指定的字符串的长度,区别在于:sizeof包括结束字符"\0",而strlen()不包括。
例如:
输出结果:
strlen(str)= 5,sizeof(str)=6