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