如何复制动态分配的结构数组?
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);
我一直在为此苦苦挣扎。我在 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);