2012-07-13 68 views
2

我有这三种结构,阵列构建铸造

typedef struct serial_header { 
    int zigbeeMsgType; 
    int seqNumber; 
    int commandIdentifier; 
    int dest; 
    int src; 
}serial_header_t; 


typedef struct serial_packet { 
    serial_header_t header; 
    int data[]; 
} serial_packet_t; 

和最后一个是

typedef struct readAttributePacket 
{ 
    int      u8SourceEndPointId; 
    int      u8DestinationEndPointId; 
    int      u16ClusterId; 
    int      bDirectionIsServerToClient; 
    int      u8NumberOfAttributesInRequest; 
    int      bIsManufacturerSpecific; 
    int      u16ManufacturerCode; 
    int      pu16AttributeRequestList[]; 
}readAttributePacket_t; 

我用这个代码困扰,我只是想投的数据[]数组驻留在serial_packet_t中放入readAttributePacket_t结构中。 我认为数据[]应该是

data[]={0x01,0x01,0x04,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 

我需要将这些数据转换为readAttributePacket_t结构。但是这下面的代码显示错误。

void main() 
{ 
int a[]= {0x32,0x00,0x31,0x69,0x69,0x00,0x00,0x01,0x01,0x04,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 
int i; 
readAttributePacket_t *p; 
serial_packet_t *data; 

data = (serial_packet_t*)&a; 

for(i=0;i<20;i++){ 
    printf(" %02x \n",a[i]); 
} 
p = (readAttributePacket_t *)&data->data; 
printf("\nu8SourceEndPointId:%x \nu8DestinationEndPointId:%x \nu16ClusterId:%04x \nbDirectionIsServerToClient:%x \nu8NumberOfAttributesInRequest:%x \nbIsManufacturerSpecific:%x \nu16ManufacturerCode:%04x",p->u8SourceEndPointId, 
    p->u8DestinationEndPointId, 
    p->u16ClusterId, 
    p->bDirectionIsServerToClient, 
    p->u8NumberOfAttributesInRequest, 
    p->bIsManufacturerSpecific, 
    p->u16ManufacturerCode); 


getch(); 
} 

输出应该像

u8SourceEndPointId=01 
u8DestinationEndPointId=01 
u16ClusterId=0402 
bDirectionIsServerToClient=00 
u8NumberOfAttributesInRequest=02 
bIsManufacturerSpecific=00 
u16ManufacturerCode=0000 

我怎么能得到pu16AttributeRequestList []数组readAttributePacket_t结构,应该喜欢,

pu16AttributeRequestList[0]=0000 
pu16AttributeRequestList[1]=0001 
+0

什么样的价值观是它呈现,到底是什么? – 2012-07-13 12:09:44

+0

u8SourceEndPointId = 0, u8DestinationEndPointId = 0, u16ClusterId = 0001, bDirectionIsServerToClient = 1, u8NumberOfAttributesInRequest = 4, bIsManufacturerSpecific = 2, u16ManufacturerCode = 0000其示出了这样 – 2012-07-13 12:22:28

+0

你应该做的联合而不是与所述阵列和它的结构readAttributePacket。 – 2012-07-13 12:22:47

回答

5

你不能只投一个数组到一个结构,因为它们只是不兼容的类型。由于内存对齐限制,编译器需要在结构的字段之间插入填充,因此成员不在您期望的内存地址。解决方案:

  1. 便携式但速度较慢/较硬至手动执行(优选):该结构的字段手动复制到阵列。
  2. 短写,但GCC特异性:使用__attribute__((packed))关键字进行GCC不是结构域之间引入填充。
+0

非常感谢,__attribute __((packed))完美地工作。 – 2012-07-13 12:40:39

+0

如果结构中的所有数据类型都一致,该怎么办?例如所有指针 – 2017-03-21 06:42:29

0

建设的3层结构的联合。全部在相同的内存空间上。那么你甚至不需要投。

+1

这在技术上是未定义的行为,无论是C++或C99标准保证从比最近写入工会成员以外的任何读书会工作。联盟是一种节省内存的设备,不是铸造,也不应该用于铸造。即使它可能适用于给定的编译器和平台,但并不保证每次都在每个编译器和平台上这样做。 – talonmies 2012-07-15 08:36:34