gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:28:57 25 4
gpt4 key购买 nike

我需要直接将值从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 都指向同一个内存块。您释放该 block ,然后尝试输出其内容。

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

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

b.name = malloc( strlen(a.name) + 1 );
strcpy(b.name, a.name);
<小时/>

换句话说,结构器官的所谓“深层复制”过程与赋值运算符执行的过程不同。

我建议您创建一个函数来执行structorgan的副本,其行为按照您想要的方式进行;并调用该函数,而不是使用赋值运算符或memcpy。

您也可以对 struct human 的复制执行相同的操作。

关于c - 我如何将结构指针数组中的结构直接复制到c中的另一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53438919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com