我如何直接将结构指针数组中的结构复制到 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.name
和 b.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
.
我需要直接将一个值从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.name
和 b.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
.