首页 > 解决方案 > 如何将结构指针数组中的结构直接复制到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);
}

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

标签: cpointersstructmallocstrcmp

解决方案


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

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.name和都b.name指向同一个内存块。您释放该块,然后尝试输出其内容。

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

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

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

换句话说,a 的所谓“深拷贝”的struct organ过程与赋值运算符执行的过程不同。

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

您也可以对复制struct human.


推荐阅读