2012-10-28 107 views
0

我無法解釋爲什麼這兩個C片斷的行爲不一樣。我試圖序列化兩個結構,呃和啊,作爲單個字節緩衝區(uint8_t)。第一個代碼塊工作,第二個代碼塊不工作。我無法弄清楚區別。如果任何人都可以向我解釋它,將不勝感激。兩個C片段之間的區別

塊1:

uint8_t arp_reply_buf[sizeof(eh) + sizeof(ah)]; 
uint8_t *eh_ptr = (uint8_t*)&eh; 
for (int i = 0; i < sizeof(eh); i++) 
{ 
    arp_reply_buf[i] = eh_ptr[i]; 
} 
uint8_t *ah_ptr = (uint8_t*)&ah; 
int index = 0; 
for (int i = sizeof(eh); i < (sizeof(eh) + sizeof(ah)); i++) 
{ 
    arp_reply_buf[i] = ah_ptr[index++]; 
} 

塊2:

uint8_t arp_reply_buf[sizeof(eh) + sizeof(ah)]; 
arp_reply_buf[0] = *(uint8_t *)&eh; 
arp_reply_buf[sizeof(eh)] = *(uint8_t *)&ah; 
+2

第二個 「不工作」?它做什麼而不是工作? –

+0

對不起。第一個代碼塊生成正確的緩衝區,而第二個代碼塊生成不同的緩衝區,在正確的位置沒有一個特定的字段。它似乎以某種方式抵消。 – Schemer

+0

由於某些原因,我將它們標記爲「塊1」和「塊2」,因爲該帖子不會讓我將它們分成兩個單獨的代碼塊。我使用了兩次由空行分隔的代碼塊標記,並將它們組合在我身上。 – Schemer

回答

3

在第二例中僅在兩個索引設置值:

  1. arp_reply_buf[0]

    arp_reply_buf[0] = *(uint8_t *)&eh; 
    
  2. arp_reply_buf[sizeof(eh)]

    arp_reply_buf[sizeof(eh)] = *(uint8_t *)&ah; 
    
+0

啊,我認爲結果將是所有下列指數將被結構的其餘部分覆蓋。 – Schemer

+0

呃,不,不行,像這樣... – MByD

+1

@Schemer:你想用['memcpy'](http://linux.die.net/man/3/memcpy)這個 –