Какой уровень косвенности использовать в структурах? - PullRequest
0 голосов
/ 20 марта 2011

Я хочу создать простую структуру, которая содержит идентификатор типа int и значение любого вида.Стоит ли использовать

struct {
    int key;
    void *value;
}

или

struct {
    int key;
    void **value;
}

или что-то еще?

Ответы [ 2 ]

4 голосов
/ 20 марта 2011

Я бы использовал первое, так как void* может указывать на что угодно.Похоже, в вашем случае нет необходимости в двойном косвенном указании.

Следует также иметь в виду, что есть и другой способ, который предполагает наличие полезной нагрузки переменного размера внутри структуры, а не фиксированнойvoid*.Это полезно в случае, когда сами структуры размещены (например, в связанном списке), так что вы можете сделать их переменным размером, настроив аргумент на malloc.

В этом случае вы можете избежать указателейструктура в целом.См. этот ответ для более подробной информации.Я не предполагаю, что это необходимо (или даже хорошая идея) для этого конкретного случая, просто предоставляя это как другую возможность.Я подозреваю, что ваш вариант 1 будет более чем достаточным, или предоставит объединение в структуре, если вы не хотите указатель там.

0 голосов
/ 20 марта 2011

Я думаю, вы должны использовать комбинацию union и struct:

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

Указатель указывает только на переменную, он не содержит ее значения. Вы должны хранить фактическую переменную в другом месте.

...