【问题标题】:What level of indirection to use in structs?在结构中使用什么级别的间接?
【发布时间】:2011-07-19 04:01:02
【问题描述】:

我想创建一个简单的结构来保存int 类型的标识符和任何类型的值。我应该使用

struct {
    int key;
    void *value;
}

或

struct {
    int key;
    void **value;
}

还是别的什么?

【问题讨论】:

  • @Mihran: C(看标签;))
  • @user282636 :) 我以为你可能忘记了 c++ 标签

标签: c struct void-pointers


【解决方案1】:

我会使用第一个,因为 void* 可以指向任何东西。在您的情况下,似乎不需要双重间接。

您还应该记住,还有另一种方法,即在结构中包含可变大小的有效负载,而不是固定的void*。它在结构本身被分配的情况下(例如在链表中)很有用,因此您可以通过将参数调整为 malloc 来使其大小可变。

在这种情况下,您可以完全避免结构中的指针。有关详细信息,请参阅this answer。我并不是说对于这种特殊情况有必要(甚至是一个好主意),只是将其作为另一种可能性提供。我怀疑你的选项 1 会绰绰有余,或者如果你不想要任何指针,则在结构中提供一个联合。

【讨论】:

  • 到目前为止,我总是存储一个指针作为我的值。由于在给定系统上所有指针的大小都是相等的(真的吗?),我真的不需要跟踪大小。
【解决方案2】:

我认为你必须使用联合和结构的组合:

struct my_struct {
        int key;
        union {
                int a_int;
                float a_float;
                char a_char;
                /* Other types You may need */
        } value;
}

指针只指向一个变量,它不保存它的值。您必须将实际变量存储在其他地方。

【讨论】:

  • 不,我在我的结构中存储复杂的、可变大小的数据。
  • 使用 void*。好吧,您可以随时将其转换为 void**。
猜你喜欢
  • 2014-04-13
  • 2011-09-13
  • 2014-05-24
  • 2021-12-19
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
相关资源
最近更新 更多