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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM