如何复制数据?

时间:2010-07-06 10:56:57

标签: c++

我有一个回调函数,其参数为const unsigned char *pData。每次我点击回调函数时,我都需要将pData值存储到我的本地unsigned char*变量中。有没有复制数据的功能?


修改:以下是代码示例:

void Callbackfun(int x, const unsigned char* pData, const UINT cbData) {
    switch(x) {
    case 0:
        // ptr is a global variable of structure containg name and number
        ptr.name = (unsigned char*)pData;
        break;
    case 1:
        ptr.number = (unsigned char*)pData;
        break;
    }
}

现在每次调用此函数时,我都希望将pData值存储在我的本地结构中(如ptr.name所示)。

2 个答案:

答案 0 :(得分:2)

在回调函数中,您必须为“数据”分配本地内存。这样,当调用函数离开作用域时,您可以保留它。如果你知道数据的长度,并且长度是一致的,你有两个选择。动态分配,或在堆栈上分配。代码示例未经测试。

这是动态分配和复制。

 unsigned char* localData = new unsigned char[42];
 memcpy( localData, pData, 42 );

这是堆栈分配版本

 unsigned char localData[42];
 memcpy( &localData, pData, 42 );

我假设您没有传递字符串数据,因为您使用的是unsigned char。由于您只处理指针,因此您必须知道用于分配的缓冲区大小。

如果您没有恒定的数据长度,那么您需要将其作为第二个参数传递给回调函数。

答案 1 :(得分:1)

如果您可以更改struct似乎是ptr的实例,我建议您这样做:

#include <string>

struct ptr_type {
    std::string name;
    std::string number;
};

ptr_type ptr;

对于回调,假设cbData告诉我们pData指向的缓冲区的大小:

void Callbackfun(int x, const unsigned char* pData, const UINT cbData) {

    // The following line will copy the buffer pointed to by
    // pData into an std::string object:
    std::string data(pData, cbData);

    switch(x) {
    case 0:
        // Simple assignment of std::string objects copies the
        // entire buffer:
        ptr.name = data;
        break;
    case 1:
        ptr.number = data;
        break;
    }
}