C 是否有一种较短的方法来初始化结构数组?

C 是否有一种较短的方法来初始化结构数组?,c,struct,microchip,C,Struct,Microchip,我有这样一个“缓冲区中的缓冲区”: #define BUFFER_MESSAGE_COUNT 5 unsigned char buffer_data[BUFFER_MESSAGE_COUNT][128]; typedef struct { unsigned char *data; int size; int cursor; } t_buffer; typedef struct { int cursor; int size; t_buffer

我有这样一个“缓冲区中的缓冲区”:

#define BUFFER_MESSAGE_COUNT 5

unsigned char buffer_data[BUFFER_MESSAGE_COUNT][128];

typedef struct {
    unsigned char *data;
    int size;
    int cursor;
} t_buffer;

typedef struct {
    int cursor;
    int size;
    t_buffer buffers[BUFFER_MESSAGE_COUNT];
} t_message_buffer;

t_message_buffer message_buffer = {
    0,
    BUFFER_MESSAGE_COUNT,
    {
        { buffer_data[0], sizeof(buffer_data[0]) / sizeof(char), 0 },
        { buffer_data[1], sizeof(buffer_data[1]) / sizeof(char), 0 },
        { buffer_data[2], sizeof(buffer_data[2]) / sizeof(char), 0 },
        { buffer_data[3], sizeof(buffer_data[3]) / sizeof(char), 0 },
        { buffer_data[4], sizeof(buffer_data[4]) / sizeof(char), 0 }
    }
};
有没有比给出所有元素更短/更好的方法来声明和初始化它


我正在使用Microchip XC8编译器,但这个问题可能是通用的。

我假设您正在一个大小确实重要的环境中工作(需要更改)

如果是这样的话,我不太确定这是一种初始化RAM结构的有效方法。
这将迫使编译器为预主静态变量初始化分配相同数量的ROM

由于您的结构的内容似乎相当冗余,因此使用初始值设定项函数在资源使用方面可能会更有效,并且肯定比初始值设定项宏更具可读性和进化性


在所有条件相同的情况下,我只需要一个初始化函数。

您使用的方法很好,但适应性不强。使用
for
循环会更好:

t_message_buffer message_buffer;

message_buffer.cursor = 0;
message_buffer.size = BUFFER_MESSAGE_COUNT;
for(int i = 0; i < BUFFER_MESSAGE_COUNT; i++)
{
    message_buffer.buffers[i].data = buffer_data[i];
    message_buffer.buffers[i].size = sizeof(buffer_data[i]);
    message_buffer.buffers[i].cursor = 0;
}
t_message_buffer message_buffer;
消息_buffer.cursor=0;
message\u buffer.size=缓冲区\消息\计数;
对于(int i=0;i

这样,如果
BUFFER\u MESSAGE\u COUNT的值发生变化,则无需调整代码中的许多位置。

定义“更短”和“更好”。上述初始化不会花费任何额外的执行时间或内存空间,因为
message\u buffer
是位于可执行文件数据部分的全局变量。这意味着可执行映像将包含一段硬编码值,每次运行程序时,操作系统(连同映像的其余部分)都会将其加载到内存中。如果该变量是局部变量(在函数中),则每次执行函数时都会进行初始化。您可以避免除以
sizeof(char)
,因为它总是1。我指的是代码行的“较短”,不在执行时间内。@barakmanos除非您直接从裸骨微控制器环境中的EEPROM启动,这很可能是在使用微芯片编译器的情况下。您可以删除此怪物:
sizeof(buffer\u data[0])/sizeof(char)
。请注意,数组的大小始终为128,这是一个常量,因此可以通过为此大小定义一个常量来改进代码:
#define ARRSIZE 128
。另一方面,sizeof(char)总是1,因为标准的C规则。然后,例如:
{buffer\u data[0],ARRSIZE,0},
。对于主要问题,正如其他人所说,初始化函数似乎是最好的选择。既然一切都是0,我能为(I=0;I?我宁愿选择
memset(message_buffer,0,sizeof(message_buffer))
也应该有同样的功能。如果你不幸在真正的裸体环境中工作,我建议你自己提供一个memset或bzero函数。然而,我有点惊讶于在2014年发现一个嵌入式编译器不支持stdlib的如此有用和轻量级的部分。好吧,如果您包含正确的字符串.h(我起初没有)。