[其它应用] C技巧--结构体初始赋值

[复制链接]
1897|4
 楼主| 两只袜子 发表于 2023-11-1 15:24 | 显示全部楼层 |阅读模式
我们将定义个结构体数组,每个结构体都代表有不同成员的年龄/体重/身高信息。
方法1:类数组型赋初值
#include <stdio.h>

typedef u_int8_t u8;
typedef u_int16_t u16;
typedef u_int32_t u32;

typedef enum
{
   Harry,
   Jack,
   Jane,
   Name_End
}e_Name;

typedef struct
{
   u8 age;
   u16 weight;
   u8 Height;
}st_Test;

/*如下所示,类似于数组一样的初始赋值*/
st_Test  gstNameList[Name_End] =
{
  {17,120,166},
  {21,133,172},
  {26,140,185}
};

int  main(void)
{
   u8 u8Index = 0;

   for(u8Index = 0; u8Index < Name_End; u8Index++)
  {
       printf("age :%d, weight:%d,Name:%d\n",gstNameList[u8Index].age,gstNameList[u8Index].weight,gstNameList[u8Index].Height);
  }
}
运行后输出如下结果,可见该方法是可以完成结构体的初始值赋值动作,但该方法的弊端就是不直观,与结构体数组成员必须呈现顺序对应关系,否则会赋值错误,且无法直观的看到是给哪一个成员进行赋值。



方法2:结构体成员挨个赋值

将上述范例代码中的结构体成员赋值修改为下方代码所示,大家可以发现,即使不按照枚举顺序赋值,也一样不影响最终的赋值结果,如此就很方便对结构体数组成员进行赋值动作。
st_Test  gstNameList[Name_End] =
{
  [Jane].age = 26 ,[Jane].weight = 140, [Jane].Height = 185,
  [Harry].age = 17, [Harry].weight = 120, [Harry].Height = 166,
  [Jack].age = 26,[Jack].weight = 140,[Jack].Height = 172
};
但是,此类的赋值方式需要每个数组成员的结构体成员都要罗列出来挨个赋值,虽然很直观每个量的具体赋值情况,但代码也显得臃肿。

方法3:单列赋值
如下列代码所示赋值方式,即结合了类数组赋值的精简性,有能直观的看出是给那个结构体数组成员进行赋值,且不按照枚举顺序赋值也不影响最终赋值顺序。在对于大量结构体数组成员赋值的赋值场景下,还是显得很简便的。
st_Test gstNameList[Name_End] =
{
  [Jane] = {26,140,185},
  [Harry] = {17,120,166},
  [Jack] = {21,133,172},
};*
如上大家可以根据自己的使用场景,使用不同的结构体初值赋值方式。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
OKAKAKO 发表于 2023-11-2 09:08 | 显示全部楼层
一般在设置的时候就可以赋初始值吧
小夏天的大西瓜 发表于 2023-11-2 09:22 | 显示全部楼层
结构体在C中很重要
AdaMaYun 发表于 2023-11-6 21:23 | 显示全部楼层
一般情况下用时附初值
玫瑰凋零日记 发表于 2025-8-30 15:18 | 显示全部楼层
C 语言结构体初始赋值技巧:1. 按成员顺序初始化,如struct s={1,2,"a"};2. C99 起支持指定成员,如struct s={.b=2,.a=1};3. 未指定成员自动设 0;4. 用复合字面量临时初始化,如func((struct s){1,2})。指定成员法更清晰,尤其成员多或顺序变动时。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2122

主题

8121

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部