• 【C语言】结构体初始化


    一、3种结构体初始化方式

    结构体定义

     struct test
     {
         int a;
         char b;
         unsigned short c;
         char *p;
     };
    
    

    1. 定义时赋值

    struct test A = {10, 'a', 2, 0};
    

    2. 先定义,后赋值

    struct test B;
    
    B.a = 20;
    B.b = 'b';
    B.c = 100;
    B.p = NULL;
    

    3. 定义时指定成员赋值(乱序)

    struct test C = 
    {
        .a = 30,
        .b = 'c',
        .c = 200,
        .p = NULL
    };
    

    二、 探险

    • C语言支持以上三种结构体初始化方式,但其中又有不同

      #include <stdio.h>
      
      struct test
      {
          int a;
          char b;
          unsigned short c;
          char *p;
      };
      
      void print_test(struct test * ptr)
      {
          printf("a: %d, b: %d, c: %d,p: %d
      ", ptr->a, ptr->b, ptr->c,ptr->p);
      }
      
      void opera_struct(void)
      {
          struct test A = {10, 'b'};
          print_test(&A);
      
          struct test B;
          B.a = 10;
          print_test(&B);
      
          struct test C =
          {
              .c = 100,
          };
      
          print_test(&C);
      }
      
      int main(void)
      {
          opera_struct();
      
          return 0;
      }
      
      
    • 运行结果

      //gcc-4.8.5
      a: 10, b: 98, c: 0,p: 0
      a: 10, b: 0, c: 0,p: 0
      a: 0, b: 0, c: 100,p: 0
      
      //MinGw
      a: 10, b: 98, c: 0,p: 0
      a: 10, b: 0, c: 0,p: 16
      a: 0, b: 0, c: 100,p: 0
      
    • 第一种与第三种赋值方式相比第二种是不一样的,前两者是定义时进行初始化,对于未被初始化的成员,系统初始化为0,而后者是定义之后进行赋值的操作,不同的编译器有不同的操作方法,在MinGW呈现的是随机值

    • 自己在实际的项目中,利用了第二种方法对结构体进行初始化,项目在一个平台正常运行,在另一个平台上却出现了异常,排查很久才查到,以此作为警戒

    • 建议:在实际工程项目中,多使用第三种初始化赋值方式,而如果使用了第二种初始化方式,别忘了用memset对结构体进行赋0操作

  • 相关阅读:
    css笔记图
    C#基础(四)条件、循环和判断
    C#基础(三)引用类型和预定义值类型
    C#基础(二)变量和常量
    C#基础(一)
    jquery实现全选和取消全选
    jquery easyUI datagrid自动计算两列的值
    纯CSS竖直菜单
    easyui被activeX控件挡住的解决方法
    jquery实现WIN7本地磁盘容量条效果
  • 原文地址:https://www.cnblogs.com/chenj-nry/p/14823086.html
Copyright © 2020-2023  润新知