7 struct 和 union

1 struct 关键字

  • C语言中的 struct 可以看作变量的集合

  • 问题:空结构体占用多大内存?

    • Demo

      #include <stdio.h>
      
      struct TS
      {
          
      };
      
      int main()
      {
          struct TS t1,t2;
          
          printf("sizeof(struct TS) = %d
      ",sizeof(struct TS));
          printf("sizeof(t1) = %d
      ,&t1 = %p
      ",sizeof(t1),&t1);
          printf("sizeof(t2) = %d
      ,&t2 = %p
      ",sizeof(t2),&t2);
          
          return 0;
      }
      
    • GCC 编译运行

      sizeof(struct TS) = 0
      sizeof(t1) = 0,&t1 = 0xbfb19e30
      sizeof(t2) = 0,&t2 = 0xbfb19e30
      
    • VS编译:不允许有空结构体的存在

2 结构体与柔性数组

  • 柔性数组即数组大小待定的数组

  • C 语言中可以由结构体产生柔性数组(带有长度的数组)

  • C 语言中结构体的最后一个元素可以是大小未知的数组

  • 示例

    • 结构体 SoftArray 中的 array 数组变量仅是一个待使用的标识符,不占用存储空间
    #include <stdio.h>
    struct SoftArray
    {
        int len;      // 标识柔性数组的大小
        int array[];  // 柔性数组
    }
    
    int main()
    {
        printf("sizeof(struct SoftArray) = %d
    ",sizeof(struct SoftArray));  //4
        
        return 0;
    }
    
  • 柔性数组的用法

    • array 数组虽然没有指定大小,但可以在使用的时候利用 malloc 函数指定其大小
    #include <stdio.h>
    #include <malloc.h>
    
    struct SoftArray
    {
        int len;
        int array[];
    };
    
    //动态创建柔性数组,大小可变
    struct SoftArray* create_soft_array(int size)
    {
        struct SoftArray* ret = NULL;
        
        if( size > 0 )
        {
            ret = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * size);
            
            ret->len = size;
        }
        
        return ret;
    }
    
    //销毁柔性数组
    void delete_soft_array(struct SoftArray* sa)
    {
        free(sa);
    }
    
    //使用柔性数组,这里只需要传递一个柔性数组地址,而不需要额外传递柔性数组的大小
    void func(struct SoftArray* sa)
    {
        int i = 0;
        
        if( NULL != sa )
        {
            for(i=0; i<sa->len; i++)
            {
                sa->array[i] = i + 1;
            }
        } 
    }
    
    int main()
    {
        int i = 0;
        //创建一个柔性数组,大小为10
        struct SoftArray* sa = create_soft_array(10);
       
        //对柔性数组每个成员进行赋值
        func(sa);
        
        for(i=0; i<sa->len; i++)
        {
            printf("%d,", sa->array[i]);  // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
        }
        
        delete_soft_array(sa);
        
        return 0;
    }
    

3 union 关键字

  • C 语言中的 union 在语法上与 struct 相似

  • union 只分配最大成员的空间,所有成员共享这个空间

    #include <stdio.h>
    struct A
    {
        int a;
        int b;
        int c;
    };
    
    union B
    {
        int a;
        int b;
        int c;
    }
    
    int main()
    {
        printf("%d
    ",sizeof(struct A));  // 12
        printf("%d
    ",sizeof(union B));   // 4
        
        return 0;
    }
    
  • union 的使用受系统大小端的影响

    • 小端模式:低地址存储低位数据,大端模式:低地址存储高位数据

  • 示例:编程判断系统的大小端

    • 小端模式:由于变量 c 只占用一个字节,取出地址中低地址的一个字节,输出 1
    • 大端模式:输出 0
    #include <stdio.h>
    
    int system_mode()
    {
        //最大内存:4字节
        union SM
        {
            int i;
            char c;
        };
    
        union SM sm;
        
        sm.i = 1;
        
        return sm.c;
    }
    
    
    int main()
    {
        printf("System Mode: %d
    ", system_mode());  //1 => 小端模式
        return 0;
    }
    
原文地址:https://www.cnblogs.com/bky-hbq/p/13598587.html