C语言拾锦 --- 对指定的结构体数组成员进行初始化

对指定的结构体数组成员进行初始化

概述

今天在看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;
}

下面是运行结果:
在这里插入图片描述
这种看似很复杂的东西,揉碎了来看其实也很简单。不过是对结构体和数组初始化的一种综合呈现。所以我们再日常开发中对一些看似比较复杂东西,要去分析其底层原理,对一些基础知识进行整理,再综合来分析。其实很多看似很难的问题就会迎刃而解。哈哈哈,自己的一点儿感慨!!!

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值