2013-08-04 108 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

相关问题