功能:计算数据类型所占空间大小;
返值:返回数据类型所占空间大小,如果判断字符串实际长度,包括‘\0’在内;
与strlen比较:
功能:计算字符串长度
返值:返回字符串实际长度,不包括‘\0’在内;
1 #include <stdio.h> 2 #include <string.h> 3 4 int main(int argc, const char *argv[]) 5 { 6 int a = 10; 7 double b = 20; 8 char c[10] = "hello"; 9 char d[] = "hello"; 10 11 printf("size(a) = %d\n",sizeof(a)); 12 printf("size(b) = %d\n",sizeof(b)); 13 14 printf("size(c) = %d\n", sizeof(c)); 15 printf("len(c) = %d\n", strlen(c)); 16 17 printf("size(d) = %d\n", sizeof(d)); 18 19 return 0; 20 }
结果:
难点:sizeof判断结构体所占空间大小
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1、 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2 、结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,
如有需要编译器会在成员之间加上填充字节(internal adding);
3 、结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最
末一个成员之后加上填充字节(trailing padding)。
1 #include <stdio.h> 2 3 struct { 4 int a; 5 int b; 6 }s1; 7 8 struct { 9 int a; 10 short b; 11 int c; 12 }s2; 13 14 struct { 15 int a; 16 char b; 17 short c; 18 }s3; 19 20 struct { 21 char a; 22 char b; 23 char c; 24 }s4; 25 26 27 int main(int argc, const char *argv[]) 28 { 29 printf("s1 = %d\n",sizeof(s1)); 30 printf("s2 = %d\n",sizeof(s2)); 31 printf("s3 = %d\n",sizeof(s3)); 32 printf("s4 = %d\n",sizeof(s4)); 33 34 printf("a = %p\n",&s3.a); 35 printf("b = %p\n",&s3.b); 36 printf("c = %p\n",&s3.c); 37 38 39 return 0; 40 }
结果: