如何复制动态分配的struct数组?

时间:2015-12-04 22:47:15

标签: c struct memcpy dynamically-generated

我一直在努力解决这个问题。我在stackoverflow上找到了什么,其他地方只是这样做:

memcpy(&a, &b, sizeof(b));

但对我来说,这不起作用。所以我想,我在没有任何意外行为的情况下分享对我有用的东西。

2 个答案:

答案 0 :(得分:2)

假设你有:

#define N 42
struct struct_name *a = malloc(sizeof *a * N);  // allocate N objects
struct struct_name *b = malloc(sizeof *b * N);  // allocate N objects

然后复制结构对象数组的正确memcpy调用是:

memcpy(a, b, sizeof *a * N);

答案 1 :(得分:1)

在我的情况下,先前的解决方案无法正常工作,例如问题中的一个! (它复制了大约一半的第一个元素) 所以万一有人需要一个解决方案,这将给你正确的结果,这里是:

memcpy(a, b, n * sizeof(*b));

更多细节:

int i, n = 50; 
struct YourStruct *a, *b;

a = calloc(n, sizeof(*a));
b = malloc(n * sizeof(*b));
for (i = 0; i < n; ++i) { 
    // filling a
}

memcpy(b, a, n * sizeof(*a)); // <----- memcpy 'n' elements from 'a' to 'b'

if (a != NULL) free(a); // free 'a'
a = calloc(2*n, sizeof(*a)); // 'a' is size 2n now

memcpy(a, b, n * sizeof(*b)); // <------ memcpy back the 'n' elements from 'b' to 'a'

// do other stuff with 'a' (filling too)...

一些注意事项:

  • 我使用calloc作为a,因为在&#39; //填充&#39;我正在做的部分 需要初始化数据的操作。
  • 我也可以使用realloc。
  • 我有点做一个动态增长的数组(大小翻倍 - &gt; log(n)),但在这里我简化了它。
  • 您应该检查内存分配是否成功(a,b NULL或不是)。但在这里,我删除了那些检查以简化。