【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操作

原文地址:https://www.cnblogs.com/chenj-nry/p/14823086.html