c - 如何将结构指针数组中的结构直接复制到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);
换句话说,a 的所谓“深拷贝”的struct organ
过程与赋值运算符执行的过程不同。
我建议您创建一个函数来执行以struct organ
您想要的方式运行的副本;并调用该函数而不是使用赋值运算符或memcpy
.
您也可以对复制struct human
.
推荐阅读
- django - 每次点击某些网址时,将视图增加 1?
- r - R - 查找连续时间戳中的最大值(此处为秒)
- python - 在 FBA 之后访问 .summary 的值
- ssh - 安装 arch gitlab 并且无法使用 ssh 方法进行 git clone
- c++ - 在 C++ 中返回具有对另一个类对象的引用的对象的有效方法
- swift - 无法将 Dictionary 类型的值分配给 LazyMapCollection
- swift - url 路径中的 Alamofire 变量或参数支持
- mqtt - 在 Artemis 中为 MQTT 设置安全设置
- python - 是否可以在 wxPython gizmos ledctrl 上贴标签?
- python - 是否可以在 lambda 函数中创建多个语句?