2013-08-04 83 views
1

我將結構的地址傳遞給函數。如何將一個結構指針的數據拷貝到另一個結構成員

void validate(void *ptr) 
{ 
    // A variable of type Msgmt Structure 
    Msgmt msg; 
    memset(&msg, 0, MSG_SIZE); 

    // Type casting the void pointer to this structure dev_t 
    dev_t *elem = (dev_t*)ptr; 
    msg.msg_id = 10; 
    if (elem->devCategory == VAL){ 
     // This statement crashes the code 
     // memcpy(msg.messageData.value.data, elem->data, LEN); 

     // This statement goes through 
     memcpy(&msg.messageData.value.data,elem->data,LEN) ; 
    } 

    // ... do something 
} 

messageData是結構MSG和值內的聯合是聯合成員和數據是無符號字符的陣列。

我應該怎麼做elem->data的memcpy到msg.messageData.value.data? (elem->data是一組unsigned char

謝謝!!!

+3

如果你真的想要的是'dev_t *',你爲什麼要'void *'? – user2357112

+4

你能提供你正在使用的數據類型的定義嗎? (源代碼,請不要說明。) – user2357112

+0

如何定義/計算LEN? – alk

回答

0

該語句崩潰,因爲指針爲NULL。

在此清除會員。

memset(&msg, 0, MSG_SIZE); 

    // Type casting the void pointer to this structure dev_t 
    dev_t *elem = (dev_t*)ptr; 

這是唯一的東西,你initiliaze的東西。

msg.msg_id = 10; 
    if (elem->devCategory == VAL){ 

在這裏你可以訪問NULL指針,幸運的是你會崩潰。

 // This statement crashes the code 
     // memcpy(msg.messageData.value.data, elem->data, LEN); 

而在這裏,您最有可能會損壞其他內存,而不會崩潰。

 // This statement goes through 
     memcpy(&msg.messageData.value.data,elem->data,LEN) ; 
    } 

    // ... do something 
} 

您必須分配msg.messageData.value.data一些定義的內存,纔可以使用它作爲一個目標memcp

+0

所以你**假設**'msg.messageData.value.data'爲'char *',對不對? – alk

+0

@alk,你是什麼意思? OP將其結構覆蓋爲0,因此他在傳遞給memcp的指針表示他正在使用0作爲目標指針。這並不令人驚訝,它崩潰。在第二個語句中,他傳遞了指針的地址,當然這是有效的,因爲這是堆棧中的內容,但它不可能是正確的,除非LEN == 4.從他正在嘗試複製的不完整示例來自elem-> data的一些數據結構。我認爲'data'是一個指針,因爲他使用它作爲memcp的目標,但是沒有看到Msgmt,這很難說。 – Devolus

+0

我的意思是說,從當前的發佈是不知道'msg.messageData.value.data'是否被聲明爲'char *'或類似'char []''。 – alk

相關問題