sizeof判断所占空间大小

功能:计算数据类型所占空间大小;
返值:返回数据类型所占空间大小,如果判断字符串实际长度,包括‘\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 }

结果:

 

posted @ 2017-02-13 13:48  星星之火pxl  阅读(419)  评论(0编辑  收藏  举报