一、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操作
