如何在 C 中声明结构数组

Posted

技术标签:

【中文标题】如何在 C 中声明结构数组【英文标题】:How to declare array of structs in C 【发布时间】:2019-02-28 21:42:55 【问题描述】:

在用数据填充结构数组之前,我无法声明它们。

我的结构是这样的:

typedef struct 
  uint8_t * p_data;     ///< Pointer to the buffer holding the data.
  uint8_t   length;     ///< Number of bytes to transfer.
  uint8_t   operation;  ///< Device address combined with transfer direction.
  uint8_t   flags;      ///< Transfer flags (see @ref NRF_TWI_MNGR_NO_STOP).
 nrf_twi_mngr_transfer_t;

在我的代码中,我试图像这样声明数组:

struct nrf_twi_mngr_transfer_t start_read_transfer[10];

但是我得到一个编译错误:

数组类型有不完整的元素类型'struct nrf_twi_mngr_transfer_t'

我已经四处搜索,因为我认为这应该是一件常见的事情,但我无法弄清楚我做错了什么。也许是因为其中一个元素是指针?但是那个指针应该是固定大小的吧?

非常感谢

【问题讨论】:

nrf_twi_mngr_transfer_t start_read_transfer[10]; - 即不需要struct,你已经在定义它了。 没有定义struct nrf_twi_mngr_transfer_t 类型。您的 typedef 定义了名为 nrf_twi_mngr_transfer_t 的类型,恰好是 struct 在使用 typedef 名称时去掉 strict 关键字。 【参考方案1】:

看起来有些解释是有序的。这段代码

typedef struct 
    //...
 nrf_twi_mngr_transfer_t;

已经定义了一个可以直接使用的type。相比之下,

struct nrf_twi_mngr_transfer_struct 
    //...
;

将定义一个结构名称,并且要访问它,您需要指出您指的是一个结构。

因此,鉴于上述两个定义,您应该以不同的方式定义数组:

nrf_twi_mngr_transfer_t arr[10]; // if using typedef
struct nrf_twi_mngr_transfer_struct arr2[10]; // if using struct with no typedef

如果你想知道,

struct 
    //...
 nrf_twi_mngr_transfer_obj;

定义一个匿名结构类型的对象。

【讨论】:

完美。我想多了。。谢谢!

以上是关于如何在 C 中声明结构数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据存储在动态二维数组中,该数组在 C++ 中的另一个结构中也使用的结构中声明

如何声明一个全局结构数组并在不同的函数中使用它?

c语言中如何引用另一个源文件中定义的结构数组

c 中结构体变量 如何在其他c文件中声明

如何使用 malloc 动态声明结构中存在的数组

如何在 C 中 memset 结构