如何将结构指针数组中的结构直接复制到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结构是否“从结构指针数组保存”没有区别你可以决定是要浅拷贝还是深拷贝