zoukankan      html  css  js  c++  java
  • 【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操作

  • 相关阅读:
    java基础 -- 经典排序
    java 基础 ----- Arrays 工具类
    java基础 ---- 二维数组
    java基础 ---- 一维数组
    java基础 ---- 练习for循环
    AI 偏微分方程
    AI 反向传播神经网络
    AI 判别式模型和生成式模型
    AI 隐含狄利克雷分布
    AI 朴素贝叶斯分类
  • 原文地址:https://www.cnblogs.com/chenj-nry/p/14823086.html
Copyright © 2011-2022 走看看