sizeof用法总结
2018-08-24 本文已影响36人
里里角
基本概念:运算符,用于计算一个变量或数据类型的长度(在栈中分配的大小),以字节为单位。
在处理指针和数组上的特性
sizeof(数组首地址),得到输出数组所占地址空间的大小;
sizeof(指针)该系统中地址的字节宽度(32位为4);
如果是通过函数传递过的地址,会把数组首地址和指针无差别看做地址;
void test_sizeof_addr(char *a)
{
printf("%d\n", sizeof(a)); //4
}
void test_sizeof_array(char a[])
{
printf("%d\n", sizeof(a));//4
}
int main()
{
char b[30];
c=sizeof(b);// 30;
test_sizeof_addr(b);
test_sizeof_array(b);
return 0;
}
处理字符串和字符数组上的特性
char *s1="0123456789"; //sizeof(s1)=4;
char s2[]=“0123456789”;//sizeof(s2)=11*1;
char s3[100]="0123456789";//sizeof(s3)=100*1;
10个特性
(0)sizeof是运算符,不是函数;
(1)sizeof不能求得void类型的长度;
(2)sizeof能求得void类型的指针的长度;
(3)sizeof能求得静态分配内存的数组的长度!
(4)sizeof不能求得动态分配的内存的大小!
(5)sizeof不能对不完整的数组求长度;
(6)当表达式作为sizeof的操作数时,它返回表达式的计算结果的类型大小,但是它不对表达式求值!
(7)sizeof可以对函数调用求大小,并且求得的大小等于返回类型的大小,但是不执行函数体!
(8)sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!
(9)sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小!
位域
作用:压缩存储
格式:type [var] : digits;
type只能是int,unsigned int,signed int,char,unsigned char五种类型中的一种;
digits大小不能超过type类型占用的大小;
不能对其取地址;
无名位段的填充作用;
出现在表达式中,整型提升;
规则:
- 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
- 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
- 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,经实验VC采取不压缩方式,即即使前一个字段有空余位足够容纳后一个字段,后一个字段也没有空余位,从前一个字段类型大小之后的新字节开始存储;
- 如果位域字段之间穿插着非位域字段,则不进行压缩;
- 整个结构体的总大小为最宽基本类型成员大小的整数倍。: