对指定的结构体数组成员进行初始化
概述
今天在看iwlib库(一个开源的基于wext的wifi驱动的管理的库,可以支持我们在应用层面对wifi进行一些方便的操作)代码的时候发现了一种比较有用的对结构体结构体数组成员的初始化的方法,之前没有遇到过。第一次见有点儿新奇,在这里做一下记录。先贴出代码(对源代码进行了一定的简化):
/* Describe how a standard IOCTL looks like. */
struct ty_ioctl_description
{
__u8 header_type; /* NULL, iw_point or other */
__u8 token_type; /* Future */
__u16 token_size; /* Granularity of payload */
__u16 min_tokens; /* Min acceptable token number */
__u16 max_tokens; /* Max acceptable token number */
__u32 flags; /* Special handling of the request */
};
static const struct ty_ioctl_description standard_event_descr[] = {
[0] = {
.header_type = IW_HEADER_TYPE_ADDR,
},
[1] = {
.header_type = IW_HEADER_TYPE_QUAL,
},
[2] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = IW_CUSTOM_MAX,
},
[3] = {
.header_type = IW_HEADER_TYPE_ADDR,
},
[IWEVEXPIRED - IWEVFIRST] = {
.header_type = IW_HEADER_TYPE_ADDR,
},
[4] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = IW_GENERIC_IE_MAX,
},
[5] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = sizeof(struct iw_michaelmicfailure),
},
[6] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = IW_GENERIC_IE_MAX,
},
[7] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = IW_GENERIC_IE_MAX,
},
[8] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
.max_tokens = sizeof(struct iw_pmkid_cand),
},
};
我们之前遇到的比较常见的针对数组或者结构体某个特定成员进行初始化方法,但针对结构体数组某个特定成员进行初始化貌似并不常见。或者是我读的或写的代码量太少了,哈哈…
下面先一起对上面提到的两个方式进行一下简单的回顾。
数组
比如针对数组某个特定的成员进行初始化:
int array_test[] = {
[0] = 1,
[1] = 2,
[7] = 8,
};
这样我们就完成了针对一个整型数组array_test的初始化,该数组含有8个整型成员。其中第一个、第二个、第八个进行了初始化,其余的会默认被初始化为0。
结构体
针对结构体而言,我们如需要对某个特定的成员进行初始化:
#define NAME_SIZE 32
struct student {
unsigned char age;
unsigned int high;
char name[NAME_SIZE];
};
struct student S_student = {
.age = 18,
.name = "zhangsan",
};
我们定义了一个student类型的结构体变量S_student,并对它的age成员和name成员进行了初始化。
总结
有了上面的两个例子,我们也就可以很快的对一开始给出的代码进行分析了。其实这种针对结构体数组特定成员进行初始化的方法,是对上面提到的两种形式的初始化方法的一个综合。
下面看下针对这种形式写的一个简单的小例子:
#include <stdio.h>
#define NAME_LEN 32
#define LISI 0
#define OTHERS_1 1
#define ZHANG_SAN 2
#define OTHERS_5 5
struct Test{
unsigned char num;
char name[32];
int high;
};
struct Test Student_t[] = {
[LISI] = {
.num = 0,
.name = "lisi",
.high = 180,
},
[OTHERS_1] = {
.num = 1,
.high = 181,
},
[ZHANG_SAN] = {
.num = 2,
.name = "zhangsan",
.high = 183,
},
[OTHERS_5] = {
.num = 3,
},
};
int main(void)
{
int i;
int len = sizeof(Student_t) / sizeof(struct Test);
for(i = 0; i < len; i++) {
printf("Student_t[%d] : name = %-16s num = %d\t high = %d\n",i,Student_t[i].name,Student_t[i].num,Student_t[i].high);
}
int array_test[] = {
[0] = 12,
[1] = 13,
[5] = 19,
};
for(i = 0; i < sizeof(array_test)/sizeof(array_test[0]); i++)
{
printf("array_test[%d] = %d\n",i,array_test[i]);
}
return 0;
}
下面是运行结果:
这种看似很复杂的东西,揉碎了来看其实也很简单。不过是对结构体和数组初始化的一种综合呈现。所以我们再日常开发中对一些看似比较复杂东西,要去分析其底层原理,对一些基础知识进行整理,再综合来分析。其实很多看似很难的问题就会迎刃而解。哈哈哈,自己的一点儿感慨!!!