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

时间:2018-11-15 09:03:47

标签: c arrays struct typedef

我知道如何使用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;

但是我想为每个变量设置不同大小的数组。可以从一小部分中进行选择,即:

#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来实现

1 个答案:

答案 0 :(得分:2)

将缓冲区声明为指针:

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,
         ... 
    }
}