struct test
{
int a;
char b;
unsigned short c;
char *p;
};
struct test A = {10, ‘a‘, 2, 0};
struct test B;
B.a = 20;
B.b = ‘b‘;
B.c = 100;
B.p = NULL;
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操作
原文:https://www.cnblogs.com/chenj-nry/p/14823086.html