在结构中使用什么级别的间接?

时间:2011-03-20 15:18:02

标签: c struct void-pointers

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

struct {
    int key;
    void *value;
}

struct {
    int key;
    void **value;
}

或其他什么?

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

我认为你必须使用union和struct的组合:

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

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