zoukankan      html  css  js  c++  java
  • 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;
      }
      
  • 相关阅读:
    工作笔记(一)
    如何修改mindmanager默认字体为微软雅黑
    彻底解决zend studio 下 assignment in condition警告
    PHP5.2至5.6的新增功能详解
    ThinkPHP中的模型命名
    12大网站建设技巧 让访客信任你
    CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
    几种不错的编程字体
    大型网站的灵魂——性能
    MySQL: InnoDB 还是 MyISAM?
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13598587.html
Copyright © 2011-2022 走看看