如何将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
相关产品推荐
相关产品推荐

