struct和union,enum分析

空结构体占用的内存多大?

 1   struct d
 2   {
 3   
 4   };
 5   
 6   int main()
 7   
 8   {
 9  
10    struct d d1;
11  
12    struct d d2;
13  
14    printf("%d,%0x
",sizeof(d1),&d1); //求内存大小,及结构体变量的地址
15    printf("%d,%0x
",sizeof(d1),&d2);
16  
17  }

不同的编译器,分配的大小不一样,一般取0个字节或1个字节。

柔性数组:数组大小待定的数组,C语言中结构体最后一个元素可以是大小未知的数组,C语言中可以由结构体产生柔性数组:

1 struct softarray
2 
3 {
4 
5   int len;
6 
7   int array[];
8 
9 };

那么这个结构体的大小是多少?  最后的未知大小的数组处理为0个字节,所以说整个结构体变量的空间就是其他变量的空间之和。

 1 typedef struct _soft_array
 2 {
 3     int len;
 4     int array[];
 5 }SoftArray;
 6 
 7 int main()
 8 {  
 9     int i = 0;
10     SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int) * 10);
11     
12     sa->len = 10;
13     
14     for(i=0; i<sa->len; i++)
15     {
16         sa->array[i] = i + 1;
17     }
18     
19     for(i=0; i<sa->len; i++)
20     {
21         printf("%d
", sa->array[i]);   
22     }
23     
24     free(sa);
25     
26     return 0;
27 }

struct中每个域都在内存中分配空间;union只分配最大域的空间,所有域共享这个空间;union受系统大小端的影响:
大端模式:内存的高地址位存放数据的高字节

小端模式:内存的低地址位存放数据的高字节

 1 union c
 2 
 3 {
 4 
 5   int i;
 6 
 7   char cc;
 8 
 9 }  // 分配最大域空间,即4个字节
10 
11 union c abc;
12 
13 c.i=1;
14 
15 printf("%d
",c.cc); //大端模式:0,小端模式:1

enum:
是一种自定义类型,默认的常量的值均为整数,且第一个常量取值为0(如果不指定),其后的每一个常量均是在该常量前一个常量前加1,enum类型的变量只能取离散的值:

 1 enum color 
 3 {
 5    green,
 7    red=2, 
 9    blue,
11    black
13 };
14 enum color c =green;
15 printf("%d
",c);  //0
16 enum color c =blue;
17 printf("%d
",c);  //3
18 enum color c =black;
19 printf("%d
",c); //4

枚举类型和#define的区别:
#define 宏常量只是简单的进行值替换,枚举常量是真正意义上的常量

#define 宏常量美誉类型信息,enum是一种变量类型

typedf:

用来给一个已经存在的数据类型重命名,并没有产生新的类型,typedef重定义的类型不能进行unsigned和signed扩展。

typedef与#define的区别:

1 typedef char* path;
2 path p1,p2;  //相当于char* p1,char* p2
3 #define path char*;
4 path p1,p2;  // 相当于 char * p1,char p2
内在的趣味,表面的繁琐
原文地址:https://www.cnblogs.com/data1213/p/4821237.html