如何进行从 void* 到 c 结构的转换

问题描述

我有这个结构

typedef struct tournament_t
{
 Map players;
}*Tournament;

结构体中使用的 Map Adt 是通用的,并为 void* 使用这个 typedef

/** Data element data type for map container */
typedef void *MapDataElement;

我想要一个用于锦标赛结构的复制函数,它的类型必须是 MapDataElement 所以这就是函数

MapDataElement tournamentcopy(MapDataElement tournament)
{
 //some code
 Tournament ptr = *(Tournament*)tournament;
    copy->players=mapcopy(ptr->players);
//some code
}

问题是无论我做什么 ptr->players 始终为空 当我尝试将函数的类型从 MapDataElement 更改为 Tournament 时一切正常,但是我不允许更改它 所以......有什么想法吗?

解决方法

你有指针混淆。使用:

typedef struct tournament_t
{
    Map players;
}Tournament;


typedef struct mapdataelement_t
{
     // definition
} MapDataElement;

现在:

MapDataElement *tournamentCopy(MapDataElement *tournament)
{
    Tournament *ptr = (Tournament *)tournament;
,

您所有问题的根源是试图将指针隐藏在 typedef 后面,这使代码变得不必要地复杂和不可读 - 您这样做只会为自己制造一堆问题。

只需:

typedef struct 
{
  Map players;
} tournament_t;

我想要一个用于锦标赛结构的复制函数,它必须是 MapDataElement 类型

好吧,让 MapDataElement 有意义,void* 可能没有。如果您希望它是某种通用项目容器,则将其 typedef 如下:

typedef struct
{
  void* data;
  size_t size;
  // whatever makes sense to include here,an enum to list types perhaps?
} MapDataElement;

最后,现代 C 允许您进行类型安全的类型泛型编程,而无需使用危险的 void 指针:

#define something_copy(x) _Generic((x),\
  tournament_t: tournament_copy,\
  thingie_t:    thingie_copy) (x)

这意味着类函数宏“something_copy”将根据传递的类型调用相关的特定函数。或者,如果您传递了不支持的错误类型 - 编译器错误。