我如何直接将结构指针数组中的结构复制到 c 中的另一个结构

How can i copy directly a struct which is in pointer array of structs to another in c

我需要直接将一个值从array复制到array2,这是一个指针数组以使用指向organ值。在这段代码中,我使用了 memcpy 函数,但它不起作用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct organ{
    char *name;
};

struct human{
    struct organ *org;

};

void main(void){
    struct human*array = malloc(sizeof(struct human));
    array[0].org = malloc(sizeof(struct organ));
    array[0].org[0].name= malloc(6);

    struct human*array2 = malloc(sizeof(struct human));
    array2[0].org = malloc(sizeof(struct organ));

    strcpy(array[0].org[0].name, "lungs");
    printf("array name: %s\n",array[0].org[0].name);
    memcpy(&array2[0].org[0], &array[0].org[0], sizeof(struct organ));

    free(array[0].org[0].name);
    free(array[0].org);
    free(array);

    printf("array2 name: %s\n",(array2[0].org[0].name));

    free(array2[0].org);
    free(array2);
}

我做错了什么?我该如何解决这个问题?

这里是您代码中问题的简化:

struct organ a, b;
a.name = malloc(6);
strcpy(a.name, "hello");
b = a;
free(a.name);
puts(b.name);

您的代码使用 memcpy,但 memcpy(&b, &a, sizeof b); 实际上与 b = a; 相同,因此我在示例中使用了更简单的语法。

问题是只有一个 malloc 调用。 a.nameb.name 都指向同一个内存块。您释放该块,然后尝试输出其内容。

也许你想做的是让b.name有自己的内存块。这意味着您需要再次调用 malloc= 运算符(或 memcpy 函数)不会调用 malloc。

例如,在我的代码中,将 b = a; 行更改为:

b.name = malloc( strlen(a.name) + 1 );
strcpy(b.name, a.name);

换句话说,struct organ的所谓"deep copy"的过程与赋值运算符执行的过程不同。

我建议您创建一个函数来执行 struct organ 的副本,并以您想要的方式运行;并调用该函数而不是使用赋值运算符或 memcpy.

您也可以复制 struct human.