You need to enable JavaScript to run this app. 如何将void*类型MapDataElement转换为C结构体Tournament解决成员为空问题
优惠活动
大模型
产品
解决方案
定价
更多

如何将void*类型MapDataElement转换为C结构体Tournament解决成员为空问题

问题根因

你的问题出在指针类型转换时多了一次不必要的解引用操作,类型对应关系如下:

  • 你定义的Tournament本身就是struct tournament_t*类型(typedef时已经带了指针修饰符)
  • MapDataElement是void*的别名,入参tournament存储的本身就是指向Tournament结构体的指针值,和Tournament类型是对等的
  • 原代码中*(Tournament*)tournament的写法,相当于先把void*强转为struct tournament_t**二级指针,再解引用取值,相当于把结构体的地址当成了二级指针的存储地址去读,自然拿不到正确的players成员值。
    而你把入参改为Tournament类型后,不会做这层错误的强转和解引用,所以功能可以正常运行。

解决方法

直接把入参强转为Tournament类型即可,不需要额外解引用,参考实现代码:

MapDataElement tournamentCopy(MapDataElement tournament)
{
    // 先做空指针合法性校验
    if (tournament == NULL) {
        return NULL;
    }
    // 直接强转即可,不需要解引用
    Tournament original = (Tournament)tournament;
    // 为新的Tournament结构体分配内存
    Tournament copy = malloc(sizeof(struct tournament_t));
    if (copy == NULL) {
        return NULL;
    }
    // 拷贝players成员
    copy->players = mapCopy(original->players);
    // 其他成员拷贝逻辑...
    return (MapDataElement)copy;
}

内容的提问来源于stack exchange,提问作者Raea6789

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 04:06:02