【问题标题】:how to do a copy of data from one structure pointer to another structure member如何将数据从一个结构指针复制到另一个结构成员
【发布时间】:2013-08-04 05:11:04
【问题描述】:

我将结构的地址传递给函数。

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 是 struct msg 中的 union,value 是 union 的成员,data 是 unsigned char 数组。

我应该如何对 elem->data 进行 memcpy 到 msg.messageData.value.data ? (elem->dataunsigned char 的数组)

谢谢!!!

【问题讨论】:

  • 如果您真正想要的是dev_t *,为什么还要选择void *
  • 你能提供你正在使用的数据类型的定义吗? (请提供源代码,而不是描述。)
  • LEN 是如何定义/计算的?

标签: c pointers structure memcpy


【解决方案1】:

语句崩溃,因为指针为 NULL。

在这里清除成员。

    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){  

在这里你访问了 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 的目标。

【讨论】:

  • 所以你假设 msg.messageData.value.datachar *,对吧?
  • @alk,你是什么意思? OP 将他的结构覆盖为 0,因此他在注释块中传递给 memcp 的指针意味着他使用 0 作为目标指针。它崩溃并不奇怪。在第二个语句中,他传递了指针的地址,这当然有效,因为这是在堆栈上,但它不可能是正确的,除非 LEN == 4。从不完整的样本中,他试图复制来自 elem->data 的一些数据结构。我假设data 是一个指针,因为他将它用作memcp 的目标,但没有看到Msgmt 很难说。
  • 我的意思是,从当前的帖子来看,不知道 msg.messageData.value.data 是否被声明为 char * 或类似 char[<somevalue>]
  • msg - 结构体,messageData - 结构体中的联合体,值 - 联合体成员,数据 - 联合体成员的字符数组[]。
猜你喜欢
  • 2014-10-19
  • 2016-09-24
  • 2014-05-28
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多