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

时间:2015-02-04 14:47:28

标签: c pointers struct

我的代码中有以下内容,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'

3 个答案:

答案 0 :(得分:1)

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

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也会返回指针具有相同的值,但指向不同的类型,指向整个数组的指针,很少是正确的。)

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

答案 1 :(得分:1)

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

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

或者像创建uint8_t

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

答案 2 :(得分:0)

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

这个

uint8_t * pDMXWriteBuf = dmxRxBufA;

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

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

RDMPacket * pRDMWriteBuf = &rdmRxBufA;