You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言通过memcpy将结构体C的indexs成员i值复制到结构体A

实现方法说明

原代码的核心问题

  1. 内存分配错误:分配struct B实例时,你用了malloc(sizeof(int)),正确写法应该是malloc(sizeof(struct B))——虽然当前struct B仅包含一个int成员,但这样写更规范,也能避免后续结构体扩展时出现内存不足的问题。
  2. 无法单次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:08