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

如何将结构指针数组中的结构直接复制到c中的另一个结构,c,pointers,struct,malloc,strcmp,C,Pointers,Struct,Malloc,Strcmp,我需要直接将一个值从array复制到array2,这是一个指针数组,用于指向器官值。在这段代码中,我使用了memcpy函数,但它不起作用: #include <stdio.h> #include <stdlib.h> #include <string.h> struct organ{ char *name; }; struct human{ struct organ *org; }; void main(void){ struc

我需要直接将一个值从
array
复制到
array2
,这是一个指针数组,用于指向
器官
值。在这段代码中,我使用了
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 human*array=malloc(sizeof(struct human));
数组[0].org=malloc(sizeof(struct-organ));
数组[0].org[0].name=malloc(6);
struct-human*array2=malloc(sizeof(struct-human));
array2[0].org=malloc(sizeof(struct-organ));
strcpy(数组[0].org[0].name,“lungs”);
printf(“数组名称:%s\n”,数组[0].org[0].name);
memcpy(&array2[0].org[0],&array[0].org[0],sizeof(struct-organ));
自由(数组[0].org[0].name);
自由(数组[0].org);
自由(数组);
printf(“array2名称:%s\n”,(array2[0].org[0].name));
免费(array2[0].org);
免费(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.name
b.name
都指向同一个内存块。释放该块,然后尝试输出其内容

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

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

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

换句话说,结构器官的所谓“深度复制”过程与赋值操作符执行的过程不同

我建议您创建一个函数,用于执行
struct-organe
的副本,该副本的行为符合您的要求;并调用该函数,而不是使用赋值运算符或
memcpy


您也可以对复制
struct human

进行同样的操作
memcpy()
行是可疑的-它有点有效,因为在这段代码中
sizeof(struct organg)==sizeof(struct organg*)
,但它通常不起作用。然后,该行将
array[0]
中的指针复制到
array2[0]
,这或多或少是正常的。然后从
array
中释放数据-这没关系,只是释放了
array2
的部分也指向的数据-因此最后的
printf()
释放(array2[0].org];
行都在调用未定义的行为。您必须仔细考虑哪个结构拥有哪个指针,如果指针是共享的,如何跟踪它。@Jonathan Leffler有没有直接执行此复制处理的解决方案?因为我真的不清楚您要做什么,我不确定如何建议您你正在使用不清晰的结构(例如,你没有在结构中记录数组的大小)。大多数器官都没有那么长;如果你在
struct organe{char name[MAX_organe_name_LEN];}中包含数组,你的生活会更轻松
例如,如果将指针从一个结构复制到另一个结构,您还需要规定预期会发生什么;您是在转移所有权,还是打算复制原始数据?哦,仔细检查一下,我认为您的
memcpy()
行表示分配给
array2[0]的数据.org
被泄露。使用
array2[0].org=array[0].org;
可以达到与
memcpy()
行相同的效果。你知道POSIX函数吗?允许你使用它吗?如果你知道,它会让你的生活更轻松。并不是说很难模仿它:
char*str\u dup(const char*str){size\t len=strlen(strlen)+1;char*dup=malloc(len);if(dup!=0)memmove(dup,str,len);return dup;}
应该做这项工作。实际上我知道什么是“深度复制”,我只是想知道我能不能直接复制一个从结构指针数组保存的结构。有可能吗?@okydoky结构是否“从结构指针数组保存”没有区别你可以决定是要浅拷贝还是深拷贝