首页 > 编程语言 > 详细

【C语言探险】结构体初始化

时间:2021-05-28 19:26:13      阅读:20      评论:0      收藏:0      [点我收藏+]

一、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\n", 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操作

【C语言探险】结构体初始化

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!