假设有一个如下的struct定义:
struct astruct
{
int a;
int b;
};
struct astruct test = {0};
即使astruct中都是基础类型的成员这样的初始化话也是不正确的。
这种初始化仅仅是把a变量设置为了0,而未对b变量做初始化。
产生这样错误的原因,大概是收到数组初始化的影响。数组是可以这么初始化话的,而且初始化的值只能是0!
对结构体的初始化,可以有一下三种。
struct test
{
int a;
int b;
};
int main()
{
struct test t1 = {0, 0};
struct test t2 = {
.a=2,
.b=3
};
struct test t3 = {
a:12345,
b:567890
};
printf("t1.a = %d, t1.b = %d\n", t1.a, t1.b);
printf("t2.a = %d, t2.b = %d\n", t2.a, t2.b);
printf("t3.a = %d, t3.b = %d\n", t3.a, t3.b);
return 0;
}
第一种是C标准的用法,可移植性好,但是结构体类型复杂时,可读性很差;
第二,三种是C99 for gcc的扩展,非标准,可移植性较差;
另外,对于struct全零初始化时,可采用如下方式:
- memset(&st, 0, sizeof (st));
- bzero(&set, sizeof (st));
memset和bzero的主要区别是:参数个数不同;
memset 需要三个参数,其中第二个参数是&st指向的内存中要初始化的值,而bzero使用0来初始化