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

How to copy dynamically allocated array of struct?

我一直在为此苦苦挣扎。我在 Whosebug 和其他地方找到的只是做:

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

但对我来说,那没有用。所以我想,我分享了对我有用的东西,没有任何意外行为。

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

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

一些注意事项:

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

假设您有:

#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);