You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言数组中用数组索引初始化结构体成员?

C语言结构体二维数组的简洁初始化方案

现有数据结构

#include <pthread.h>

#define MAX_OPERATIONS 8

typedef enum _dimension_t {
    LENGTH = 0,
    WIDTH  = 1,
    HEIGHT = 2,
    MAX_DIMENS = 3
} dimension_t;

typedef int (*write_fptr_t)(int);
typedef int (*read_fptr_t)(int *);

typedef struct _mydata_t {
    const dimension_t     dimension;
    const unsigned int    operation;
    const pthread_mutex_t lock;
    const write_fptr_t    wr_func_ptr;
    const read_fptr_t     rd_func_ptr;
    int                   x;
    int                   y;
    char                  data[8];
    float                 z;
    double                a;
} mydata_t;

extern int length_wr_fptr(int val);
extern int width_wr_fptr(int val);
extern int height_wr_fptr(int val);

extern int length_rd_fptr(int * val);
extern int width_rd_fptr(int * val);
extern int height_rd_fptr(int * val);

当前两种初始化方式

1. 逐个成员初始化(可行但冗长)

这种方式能正确把每个结构体的operation字段设为对应数组索引,但代码重复度极高,维护成本大:

mydata_t mydata[MAX_DIMENS][MAX_OPERATIONS] = {
  {
    { LENGTH, 0, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 1, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 2, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 3, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 4, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 5, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 6, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 7, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr }  },
  {
    { WIDTH,  0, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  1, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  2, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  3, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  4, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  5, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  6, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  7, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr }  },
  {
    { HEIGHT, 0, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 1, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 2, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 3, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 4, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 5, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 6, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 7, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr }  }
};

2. 范围初始化(简洁但无法正确设置operation)

使用C的范围初始化语法能大幅简化代码,但所有结构体的operation字段会被设为固定值(如下示例中的0),无法自动匹配数组索引:

mydata_t mydata[MAX_DIMENS][MAX_OPERATIONS] = {
    { [0 ... MAX_OPERATIONS-1] = { LENGTH, 0, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr } },
    { [0 ... MAX_OPERATIONS-1] = { WIDTH,  0, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr  } },
    { [0 ... MAX_OPERATIONS-1] = { HEIGHT, 0, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr } }
};

需求

是否存在一种简洁的初始化方式,能让operation字段自动初始化为对应的数组索引,类似如下伪代码的效果:

mydata_t mydata[MAX_DIMENS][MAX_OPERATIONS] = {
    { [0 ... MAX_OPERATIONS-1] = { LENGTH, ##INDEX##, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr } },
    { [0 ... MAX_OPERATIONS-1] = { WIDTH,  ##INDEX##, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr  } },
    { [0 ... MAX_OPERATIONS-1] = { HEIGHT, ##INDEX##, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr } }
};

内容的提问来源于stack exchange,提问作者k8AspvNUfYhkvpT9EX5YCSzoLouT0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:55:21