目录
前言
(1)sizeof的含义
是一个C语言运算符,计算的是传进来的指针在内存中所占空间的大小,在编译时就获得了结果。
(2)特别注意
在32位编译环境中指针为4字节,long为4字节;在64位编译环境中指针为8字节,long为8字节。
一、sizeof与基本数据类型
cout<<sizeof(char)<<endl; //结果是1
cout<<sizeof(short int)<<endl; //结果是2
cout<<sizeof(int)<<endl; //结果是4
cout<<sizeof(unsigned int)<<endl; //结果是4
//32位系统
cout<<sizeof(long)<<endl; //结果是4
cout<<sizeof(unsigned long)<<endl; //结果是4
//64位系统
cout<<sizeof(long)<<endl; //结果是8
cout<<sizeof(unsigned long)<<endl; //结果是8
cout<<sizeof(float)<<endl; //结果是4
cout<<sizeof(double)<<endl; //结果是8
二、sizeof与指针变量
char *pc ="abcde";
sizeof(*pc); // 结果为1(*pc的类型为char)
sizeof(pc); // 结果为4
int *pi;
sizeof(*pi); //结果为4(*pi的类型为int)
sizeof(pi); //结果为4
char **ppc = &pc;
sizeof(ppc); // 结果为4
sizeof(*ppc); // 结果为4
sizeof(**ppc); // 结果为1(**ppc的类型为char)
double *pc ;
printf("%d",sizeof(*pc)); // 结果为8(*pc的类型为double)
printf("%d",sizeof(pc)); //结果为4
void (*pf)(); // 函数指针
sizeof(pf); // 结果为4
注意:当用sizeof求指针的长度的时,无论有没有给指针赋值,或给指针赋值多少,都与其无关,都为四个字节。
三、sizeof与数组
char a1[] = "abc";
int a2[3];
sizeof(a1); // 结果为4,字符末尾还存在一个'\0'终止符
sizeof(a2); // 结果为3*4=12(int类型为4字节)
void foo3(char a3[3])
{
int c3 = sizeof( a3 ); // c3 == 4
}
void foo4(char a4[])
{
int c4 = sizeof( a4 ); // c4 == 4
}
//'sizeof' on array function parameter 'str' will return size of 'char *'
//char a4[]相当于char * a4
注意:数组的sizeof值等于数组所占用的内存字节数。c3!=3。这里函数参数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo3时,程序会在栈上分配一个大小为3的数组吗?不会!数组是“传址”的,调用者只需将实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。
四、sizeof与函数参数
int func(char str[])
{
return sizeof(str);
//'sizeof' on array function parameter 'str' will return size of 'char *'
}
int main()
{
char str[20] = "hello world!";
printf("%d %d\n",sizeof(str),func(str));
return 0;
}
//输出:20 4
五、sizeof与struct
struct MyStruct
{
double dda1;
char dda;
int type
};
//sizeof(struct MyStruct)结果为16
(1)为上面的结构分配空间的时候,编译器根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;
(2)接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;
(3)接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,编译器自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;
(4)这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填。
六、sizeof与union
union一次只能使用其中的一个元素,因此只分配给union其中size最大的元素的空间。
typedef union {
Short i;
int k[5];
char c;
} Mat;
Typedef struct {
int i;
Mat j;
double k;
}Like;
//sizeof(Like)+sizeof(Mat)为52
//此处int k[5]占用空间最大,20字节。
//struct会对其中所有元素分配内存空间,int 4,Mat 20,double 8,一共是32字节。
总结
提示:这里对文章进行总结:
sizeof总结
4万+

被折叠的 条评论
为什么被折叠?



