作为自己的第一篇博客,完全是对于自己的一个反思!关于sizeof运算符的理解与计算,吃了很多亏,不想在一个问题上继续错误下去。
废话不多说开始写有关sizeof 的所有内容。
定义: sizeof操作符以字节形式给出了其操作数的存储大小。返回一个对象或者类型所占的内存字节数
1、用于数据类型和变量
(1):char* s = "0123456789";
sizeof(s) = 4 //s是指向字符串常量的字符指针,为一个长整型
sizeof(*s) = 1 //*s是第一个字符
(2):char s[] = "0123456789";
sizeof(s) = 11 //s是数组,计算到\0位置,因此是10+1
(3):char s[100] = "0123456789";
sizeof(s) = 100 //s表示在内存中的大小 100×1
(4):int s[100] = "0123456789"; int *s;
sizeof(s) = 400 //s表示在内存中的大小 100×4
sizeof(*s)= 4
2、用于结构体
(1):struct S {};
sizeof(S); // 结果为1,而不是0
(2):struct S1{
char c; //偏移量为0,占1个字节
int i; //偏移量为4,占4个字节
};
sizeof(S1)= 8
(3):struct S2{
char c1;//偏移量为0,占1个字节
S1 s; //偏移量为4,占8个字节,对于结构体类型用其最宽偏移量
char c2;//偏移量为12,占1个字节
};
sizeof(S2)= 12 + 1 + 3 = 16
3、sizeof与strlen的区别
char q[]="abc";
sizeof(q) = 4, sizeof(p) = 3
sizeof是运算符,在编译时便已处理,而strlen为函数,运行时才处理。并由上可以看出sizeof计算所有占用内存字节数的长度要计算‘\0’,而strlen只是计算字符串的长度并以‘\0’结束计算。
最后了解一下pack指令,它是用来调整结构体对齐方式的。基本用法如下:
#pragma pack(push) // 将当前pack设置压栈保存
#pragma pack(2) // 必须在结构体定义之前使用
。。。
#pragma pack(pop) // 恢复先前的pack设置
偏移值以和 结构体成员 相比的最小值为准