初始化指向结构的指针时类型不兼容

Incompatible types when initialising pointer to structs

我的代码中有以下内容,RDMPacket 是在包含的头文件中定义的结构。前 3 个缓冲区指针(DMX 缓冲区)工作正常,但后 3 个(RDM 缓冲区)不起作用。难道我做错了什么?我还能如何使用指针引用一组结构?

uint8_t dmxRxBufA[NumberOfChannels];
uint8_t dmxRxBufB[NumberOfChannels];
uint8_t dmxRxBufC[NumberOfChannels];

uint8_t *pDMXWriteBuf = dmxRxBufA;
uint8_t *pDMXSpareBuf = dmxRxBufB;
uint8_t *pDMXReadBuf  = dmxRxBufC;

RDMPacket rdmRxBufA;
RDMPacket rdmRxBufB;
RDMPacket rdmRxBufC;

RDMPacket *pRDMWriteBuf = rdmRxBufA;
RDMPacket *pRDMSpareBuf = rdmRxBufB;
RDMPacket *pRDMReadBuf  = rdmRxBufC;

uart.c:90:27: error: incompatible types when initializing type 'struct RDMPacket *' using type 'RDMPacket'
uart.c:91:27: error: incompatible types when initializing type 'struct RDMPacket *' using type 'RDMPacket'
uart.c:92:26: error: incompatible types when initializing type 'struct RDMPacket *' using type 'RDMPacket'

您必须将地址指向指针。使用 & 运算符获取地址:

RDMPacket *pRDMWriteBuf = &rdmRxBufA;
RDMPacket *pRDMSpareBuf = &rdmRxBufB;
RDMPacket *pRDMReadBuf  = &rdmRxBufC;

问题有点不清楚,但如果你真的想要结构数组,就像你有 unit8_t 数组一样,那么只需将它们设为结构数组:

RDMPacket rdmRxBufA[NumberOfChannels];
RDMPacket rdmRxBufB[NumberOfChannels];
RDMPacket rdmRxBufC[NumberOfChannels];

现在rdmRxBufA等把数组的第一个元素赋给指针,又可以直接赋值给指针


如果您认为不需要 & 运算符,您似乎对数组和结构的不同语义感到困惑。

对于像 int a[] 这样的数组,a 单独给出指向数组第一个元素的指针,&(a[0])
(旁注:&a 也 returns 具有相同值的指针,但指向不同的类型,指向整个数组的指针,并且很少是正确的)。

然而,结构体更多 "normal" 类型。您可以将它们用作值,例如将它们作为参数传递并将它们分配给相同类型的其他变量,因此您可以说例如 rdmRxBufA = rdmRxBufB;,这是有效的分配。如果你想要地址,你需要 &.

前三个是uint8_t的数组。这意味着 dmxRxBuf 是指向第一个元素的指针,因此,uint8_t* 其他只是 RDMPacket。如果你想传递他们的地址,你可以使用这个:

RDMPacket *pRDMWriteBuf = &rdmRxBufA;
RDMPacket *pRDMSpareBuf = &rdmRxBufB;
RDMPacket *pRDMReadBuf  = &rdmRxBufC;

或者像 uint8_t

一样创建 RDMPacket 的数组
RDMPacket rdmRxBufA[];
RDMPacket rdmRxBufB[];
RDMPacket rdmRxBufC[];

使用没有索引的数组让数组衰减到指向它的第一个元素的指针。

这个

uint8_t * pDMXWriteBuf = dmxRxBufA;

相同
uint8_t * pDMXWriteBuf = &dmxRxBufA[0];

struct 不是数组,因此它们不会衰减。请改用 &,即 Address Of 运算符。

RDMPacket * pRDMWriteBuf = &rdmRxBufA;