在 C typedef 结构中声明具有不同大小的数组

Declare arrays with different sizes in a C typedef struct

我知道如何使用 malloc 动态分配新数组。 我想知道在这种情况下是否有办法避免这种情况:

#define RX_BUFFER_SIZE    256
#define TX_BUFFER_SIZE    128

typedef struct MyBuffer 
{
    volatile uint8_t RX[RX_BUFFER_SIZE];
    volatile uint8_t TX[TX_BUFFER_SIZE];
    volatile uint16_t RX_Head;
    volatile uint16_t RX_Tail;
    volatile uint16_t TX_Head;
    volatile uint16_t TX_Tail;
} MyBuffer_t;

typedef struct MyChannel
{
    // other stuff
    MyBuffer_t buffer;
} MyChannel_t;

然后在我的代码中我创建了几个这样的变量:

MyChannel_t ch1;
MyChannel_t ch2;
MyChannel_t ch3;

但我想为每个变量设置不同大小的数组。小集合中select即可,即:

#define RX_BUFFER_SIZE_S    32
#define TX_BUFFER_SIZE_S    16

#define RX_BUFFER_SIZE_M    128
#define TX_BUFFER_SIZE_M    64

#define RX_BUFFER_SIZE_L    256
#define TX_BUFFER_SIZE_L    128

有没有办法 不用 使用 malloc

将您的缓冲区声明为指针:

typedef struct MyBuffer 
{
    volatile uint8_t * RX;
    volatile uint8_t * TX;
    size_t rxSize;
    size_t txSize;
    volatile uint16_t RX_Head;
   ...

然后为缓冲区使用单独的静态分配,并使用它们来初始化您的对象。

volatile uint8_t ch1_rx_buffer[RX_BUFFER_SIZE_S];
volatile uint8_t ch1_tx_buffer[TX_BUFFER_SIZE_S];
MyChannel_t ch1 = { 
    .buffer = {
        ch1_rx_buffer, 
        ch1_tx_buffer, 
        sizeof ch1_rx_buffer, 
        sizeof ch1_tx_buffer,
         ... 
    }
}