如何用C语言通过memcpy将结构体C的indexs成员i值复制到结构体A
实现方法说明
原代码的核心问题
- 内存分配错误:分配
struct B实例时,你用了malloc(sizeof(int)),正确写法应该是malloc(sizeof(struct B))——虽然当前struct B仅包含一个int成员,但这样写更规范,也能避免后续结构体扩展时出现内存不足的问题。 - 无法单次
memcpy的原因:tasks[0].indexs指向的是多个独立分配的struct B指针,每个struct B的i成员地址是分散的,而memcpy要求源内存是连续的,因此不能通过一次memcpy直接完成批量复制。
正确实现方式
要完成需求,必须遍历每个struct B指针,逐个将i成员复制到a.destination数组的对应位置。如果一定要用memcpy,也只能在循环中对单个int执行(但直接赋值更高效)。
修正后的完整代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct A { int destination[100]; }; struct B { int i; }; struct C { struct B ** indexs; }; int main() { struct A a; // 初始化数组,避免垃圾值干扰 memset(a.destination, 0, sizeof(a.destination)); struct C * tasks = calloc(2, sizeof(struct C)); if (!tasks) { perror("calloc tasks failed"); return 1; } // 分配5个struct B指针 tasks[0].indexs = calloc(5, sizeof(struct B *)); if (!tasks[0].indexs) { perror("calloc indexs failed"); free(tasks); return 1; } // 为前4个指针分配struct B实例(修正内存分配大小) int valid_count = 4; for (int j = 0; j < valid_count; j++) { tasks[0].indexs[j] = malloc(sizeof(struct B)); if (!tasks[0].indexs[j]) { perror("malloc struct B failed"); // 出错时释放已分配的内存,避免泄漏 for (int k = 0; k < j; k++) { free(tasks[0].indexs[k]); } free(tasks[0].indexs); free(tasks); return 1; } tasks[0].indexs[j]->i = j + 1; // 赋值1、2、3、4 } // 逐个复制每个struct B的i成员到destination数组 for (int j = 0; j < valid_count; j++) { // 直接赋值等价于:memcpy(&a.destination[j], &tasks[0].indexs[j]->i, sizeof(int)); a.destination[j] = tasks[0].indexs[j]->i; } printf("Hello World: %d\n", a.destination[1]); // 输出2 // 释放所有内存,避免泄漏 for (int j = 0; j < valid_count; j++) { free(tasks[0].indexs[j]); } free(tasks[0].indexs); free(tasks); return 0; }
额外优化建议
如果可以修改struct C的定义,建议增加一个int count成员来记录indexs中有效元素的数量,这样能避免越界访问,让代码更健壮。
如果想实现单次memcpy,需要将struct C的indexs改为指向连续的struct B数组(即struct B *indexs而非struct B **indexs),此时所有struct B的i成员在内存中是连续的,就能通过一次memcpy完成复制。
内容的提问来源于stack exchange,提问作者dsfddg dggd
相关产品推荐
相关产品推荐

