【问题标题】:How do I cast a void pointer to a struct in C?如何将 void 指针强制转换为 C 中的结构?
【发布时间】:2011-02-15 06:16:33
【问题描述】:

在我正在为其编写代码的项目中,我有一个空指针“implementation”,它是“Hash_map”结构的成员,并指向“Array_hash_map”结构。这个项目背后的概念不是很现实,但请耐心等待。该项目的规范要求我将 void 指针“实现”转换为“Array_hash_map”,然后才能在任何函数中使用它。

我的问题,具体来说是,我应该在函数中做什么来将 void 指针转换为所需的结构?每个函数的顶部是否有一个语句来转换它们,或者我每次使用“实现”时都进行转换?

这里是 Hash_map 和 Array_hash_map 的结构的 typedef 以及使用它们的几个函数。

typedef struct {
  Key_compare_fn key_compare_fn;
  Key_delete_fn key_delete_fn;
  Data_compare_fn data_compare_fn;
  Data_delete_fn data_delete_fn;
  void *implementation;
} Hash_map;

typedef struct Array_hash_map{
  struct Unit *array;
  int size;
  int capacity;
} Array_hash_map;

typedef struct Unit{
  Key key;
  Data data;
} Unit;

功能:

/* Sets the value parameter to the value associated with the
   key parameter in the Hash_map. */
int get(Hash_map *map, Key key, Data *value){
  int i;
  if (map == NULL || value == NULL)
    return 0;
  for (i = 0; i < map->implementation->size; i++){
    if (map->key_compare_fn(map->implementation->array[i].key, key) == 0){
      *value = map->implementation->array[i].data;
      return 1;
    }
  }
  return 0;
}

/* Returns the number of values that can be stored in the Hash_map, since it is
   represented by an array. */
int current_capacity(Hash_map map){
  return map.implementation->capacity;
}

【问题讨论】:

  • 有点,这是我正在做的一个大项目的一小部分

标签: c pointers struct void


【解决方案1】:

您可以在每次使用时强制转换,也可以强制转换一次并将值保存到临时变量中。后者通常是最干净的方法。

例如,您可以使用以下内容:

void my_function (Hash_Map* hmap) {
    Array_hash_map* pMap;

    pMap = hmap->implementation;

    // Now, you are free to use the pointer like it was an Array_hash_map
    pMap->size = 3; // etc, etc
}

【讨论】:

  • 我明白你们在说什么,但有一点争议。 void指针其实是一个Hash_map的一个字段,也指向一个Array_hash_map。我还能以 map->implementation = (Array_hash_map*) map->implementation; 的方式投射吗?其中 map 是传递给函数的 Hash_map,实现是 void 指针
  • map-&gt;implementation = (Array_hash_map *) map-&gt;implementation 将是无操作的。与给定范围内的符号关联的类型在 C 中是固定的 - 如果 map-&gt;implementation 的类型为 void *,则应始终如此。
  • 我想的也差不多。我想我会按照建议制作一个 Array_hash_map 并将其设置为 void 指针。感谢您的帮助!
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
相关资源
最近更新 更多