从向量到空指针的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()替换&amp;nv 回复:“将向量复制到 void 指针”——不,不,不。该代码将数据复制到由 void 指针指向的字节数组中。牢牢记住这一区别:指针指向某物,而您最关心的是它指向什么。 【参考方案1】:

std::vector 对象不是数组对象。向量管理一个动态分配的数组。就像你的 ptr 不是一个数组,而只是指向一个。

就像你不能将&amp;ptr 传递给malloc 一样(因为这会导致数据被写入指针,而不是指向的数组),所以你也不能传递&amp;nv(因为那样将导致从管理数组的向量中读取数据,而不是从正在管理的数组中读取数据)。 Vector有一个成员函数data,它返回一个指向内部数组的指针。

【讨论】:

在这种情况下,如何将对象写入缓冲区?我尝试了静态数组,它们运行良好。但就我而言,问题是我没有事先知道的数组大小。

以上是关于从向量到空指针的memcpy(反之亦然)不起作用的主要内容,如果未能解决你的问题,请参考以下文章

用子类填充的基类向量不起作用

调整动态分配的指针数组的大小(复制构造函数不起作用?)

将数据帧附加到空数据帧不起作用

分区在我的快速排序功能中不起作用

循环向量不起作用::向量下标超出范围[重复]

如何手动将新记录正确添加到空记录集中?