簡體   English   中英

錯誤的數據從空指針復制到結構

[英]Wrong data copied to struct from void pointer

好的,所以我用光了一些東西來嘗試解決此問題。

我有一個結構如下:

typedef struct
{
   u8int  NodeType;
   u32int Group;
   u32int Direction;
   u16int ID;

} tsTargetNode;


void vTrackNode(const uint8 *pu8Val, uint8 u8Len, void *pvCbData)
{
   /* Copy data */
   memcpy(pvCbData, pu8Val, u8Len);

   /* Doing this gives the wrong data */
   //tsTargetNode *node = (tsTargetNode *) pvCbData;  

   /* Doing this gives the right data */
   memcpy(&tsTargetNode.NodeType, pvCbData, 1);
   memcpy(&tsTargetNode.Group, pvCbData+1, 4);
   memcpy(&tsTargetNode.Direction, pvCbData+1+4, 4);
   memcpy(&tsTargetNode.ID, pvCbData+1+4+4, 2);
}

例如:傳遞的數據* pu8Val = 0x AA BB CC DD EE FF 11 22 33 44 55 66 77 88 99 00

使用指針,我檢索的數據是:

NodeType  = 0xAA
Group     = 0xFF112233
Direction = 0x44556677
ID        = 0x8899 

但是手動memcpy,我檢索的數據是正確的

NodeType  = 0xAA  
Group     = 0xBBCCDDEE
Direction = 0xFF112233
ID        = 0x4455

似乎是第一組嘗試將4個字節復制到NodeType中。

我做的指針復制錯誤嗎? 還是這可能是設備/硬件問題?

編譯器可以自由地在結構的成員之間添加填充,以使每個成員都與平台的自然對齊-在這里,它看起來像32位。 嘗試打印sizeof(tsTargetNode) ,並從初始化的tsTargetNode轉儲那么多字節,以查看字段的布局。

您尚未說明正在使用什么編譯器,但是將有一種特定於編譯器的方式來禁用結構的填充。 如果這樣做,其內存布局將與緩沖區匹配。

您需要告訴編譯器“打包”該結構:

typedef struct __attribute__((__packed__))
{
   u8int  NodeType;
   u32int Group;
   u32int Direction;
   u16int ID;

} tsTargetNode;

https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Type-Attributes.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM