从向量到空指针的memcpy(反之亦然)不起作用
Posted
技术标签:
【中文标题】从向量到空指针的memcpy(反之亦然)不起作用【英文标题】:memcpy from a vector to void pointer (vice-versa) not working 【发布时间】:2018-10-10 15:25:28 【问题描述】:这是具有 2 个变量的结构节点。
typedef struct
int a;
int b;
node;
将值插入节点类型的向量中。
vector <node> nv;
node n;
n.a = 10;
n.b = 20;
nv.push_back(n);
n.a = 100;
n.b = 200;
nv.push_back(n);
将向量复制到空指针。
void *ptr = malloc(4096);
memcpy((char*)ptr,&nv,sizeof(node)*2);
从 void 指针读取值
node *temp;
temp = (node*)malloc(sizeof(node));
int offset = 0;
i = 0;
while(i<n)
memcpy((node*)temp,(char*)ptr + offset, sizeof(node));
cout<<"a - "<<temp->a<<" b -"<<temp->b<<endl;
offset += sizeof(node);
i++;
我正在打印 a 和 b 的值。但它们是不正确的并且包含随机数。我确定我打错了内存位置。但不确定在哪里。
【问题讨论】:
用nv.data()
替换&nv
回复:“将向量复制到 void 指针”——不,不,不。该代码将数据复制到由 void 指针指向的字节数组中。牢牢记住这一区别:指针指向某物,而您最关心的是它指向什么。
【参考方案1】:
std::vector
对象不是数组对象。向量管理一个动态分配的数组。就像你的 ptr
不是一个数组,而只是指向一个。
就像你不能将&ptr
传递给malloc
一样(因为这会导致数据被写入指针,而不是指向的数组),所以你也不能传递&nv
(因为那样将导致从管理数组的向量中读取数据,而不是从正在管理的数组中读取数据)。 Vector有一个成员函数data
,它返回一个指向内部数组的指针。
【讨论】:
在这种情况下,如何将对象写入缓冲区?我尝试了静态数组,它们运行良好。但就我而言,问题是我没有事先知道的数组大小。以上是关于从向量到空指针的memcpy(反之亦然)不起作用的主要内容,如果未能解决你的问题,请参考以下文章