32 位系统上 char 1 byte; Shor 2 byte ; int long float 4 byte ;double 8 byte
一般如上,不同平台可能不一样,具体可以用sizeof求一下。
Siezof在计算变量所占空间大小时,括号可以省略,而计算类型大小时不能省略。
如sizeof(i),sizeof i, sizeof(int) 。错误情况如下sizeof int
int *p=NULL; Sizeof(p)=4 ;sizeof(*p)=4;p是指针,其sizeof为4;*p代表值
Int a[100] ;sizeof(a)=400;sizeof(a[100])=4,sizeof(&a)=400;sizeof(&a[0])=4; 地址为int型,int型的范围和开发环境有关,现在都是32位的,远远超出65535.
Int b[100]
void fun(int b[100]) 数组传递时,传递的是头指针。
{
Sizeof(b)=4
}
Char *q=”ancdedffg”; sizeof(q)=4; sizeof(*q)=1; q是字符指针,*q是第一个字符
char c[]="abdded";sizeof(c)=7 strlen(c)=6; 包括‘\0’.sizeof("abcdefg")=8 。
char x[10]="abcdef";printf("%d",strlen(x));strlen(x)=6 ;printf("%d",sizeof(x));sizeof(x)=10
struct MyStruct
{
char dda; 偏移量为0,满足对齐方式,dda占用1个字节;
double dda1; 下一个可用的地址的偏移量为1,不是sizeof(double)=8
的倍数,需要补足7个字节才能使偏移量变为8(满足对齐
方式),因此VC自动填充7个字节,dda1存放在偏移量为8
的地址上,它占用8个字节。
int type; 下一个可用的地址的偏移量为16,是sizeof(int)=4的倍
数,满足int的对齐方式,所以不需要VC自动填充,type
存放在偏移量为16的地址上,它占用4个字节。
};
所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为sizeof(double)=8的倍数。
所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。
struct MyStruct
{
double dda1;
char dda;
int type;
};
sizeof(MyStruc)为8+1+3+4=16。
struct MyStruct
{
static double dda1;
char dda;
int type;
};
Sizeof(MyStruct)=8。因为结构或者类中的静态成员不对结构或者类的大小产生影响,静态变量的存储位置与结构或者类的实例地址无关。
总体上遵循两个原则:
1.整体空间是占用空间最大的成员所占字节数的整数倍
2.数据对其原则。内存按结构成员的先后顺序排列,当排列到该成员变量时,其前面已摆放的空间大小必须是该类型大小的整数倍,如果不够则补齐,以此向后类推。
double *(*a)[3][6]
sizeof(a)=4 ;//a为指针
sizeof(*a)=72 ;//*a为一个有3*6个指针元素的数组
sizeof(**a)=24 ;//**a为一个数组一维的6个指针
sizeof(***a)=4 ;//***a为一维的第一个指针
sizeof(****a)=8 ;//****a为一个double变量
struct s1
{
char a[8];
};
struct s3
{
s1 s;
char a;
};
Sizeof(s3)=9,对齐方式是1.