具有可变长度数组的c结构体的静态分配

问题描述 投票:0回答:1

我想使用一个结构来存储可变长度的字节数组(UART消息)和一些其他信息/标志,例如长度、消息的作用等。我定义了一个结构:

typedef struct Message {
    int length;
    int otherInfo;
    char* bytes;
} Message;

并且想要静态分配这些结构的数组,该数组将对应于某些消息(我有一个枚举来定义索引):

Message messages[] = {
    [UART_MESSAGE_TO_DO_X] = {
        .length = 16,
        .otherInfo = 10,
        .bytes = {
            0xB5, 0x62, //array of bytes that does X
            0x06, 0x01, 
            0x08, 0x00, 
            0xF0, 0x00, 
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
            0xFF, 0x23 
        }
    },
    [UART_MESSAGE_TO_DO_Y] = {
        .length = 20,
        .otherInfo = 15,
        .bytes = {
            0xB5, 0x62, //array of bytes that does Y
            0x06, 0x41, 
            0x0C, 0x00, 
            0x00, 0x00, 0x03, 0x1F, 0xC5, 0x90, 0xE1, 0x9F, 0xFF, 0xFF, 0xFE, 0xFF, 
            0x45, 0x79 
        }
    }
}

然而,这给出了一个警告“标量初始值设定项中的多余元素”,我已经查找并看到了解决方案,其中可变大小的数组是动态分配的,然后分配为指针,但是我想静态分配,因为值永远不会改变,我是在资源有限的微处理器上工作。我知道长度未知的可变长度数组不能静态分配,但是在我的情况下,每个数组的长度已知并且是恒定的,只是长度在实例之间不同

c struct allocation
1个回答
0
投票

字符*字节;

这是一个普通的指针。分配数组。分配指针

static char array[] = {
       0xB5, 0x62, //array of bytes that does X
       0x06, 0x01, 
       0x08, 0x00, 
       0xF0, 0x00, 
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
       0xFF, 0x23 
};    
static Message messages[] = {
    [UART_MESSAGE_TO_DO_X] = {
        .length = 16,
        .otherInfo = 10,
        .bytes = array,
    },
};

或者使用复合文字,请注意它的生命周期。

static Message messages[] = {
    [UART_MESSAGE_TO_DO_X] = {
        .length = 16,
        .otherInfo = 10,
        .bytes = (char[]){
            0xB5, 0x62, //array of bytes that does X
            0x06, 0x01, 
            0x08, 0x00, 
            0xF0, 0x00, 
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
            0xFF, 0x23 
        }
    },
};

“可变长度数组”是一个定义术语 - https://en.cppreference.com/w/c/language/array#Variable-length_arrays。你的数组的大小似乎是恒定的。

© www.soinside.com 2019 - 2024. All rights reserved.