Выделение структуры с помощью void * - PullRequest
0 голосов
/ 15 января 2020

Итак, скажем, я определил эти структуры:

typedef struct LRU {
    int i;
} LRU;

typedef struct WS {
    char i;
} WS;

и в своей основной я определил пустой указатель:

void* mStruct = NULL;

В зависимости от В случае, если мне нужно использовать одну из этих структур, так что

if(!strcmp(algorithm, "LRU")) {
    mStruct = malloc(sizeof(LRU));
    mStruct->i = 1;
}
else if(!strcmp(algorithm, "WS")) {
    mStruct = malloc(sizeof(LRU));
}
else {
    printf("Unknown replacment algorithm %s\n", algorithm);
    return -1;
}

... // more code

free(mStruct);

Но эта строка кода дает мне ошибку: mStruct->i = 1;

Так как мне получить доступ к структуре, и если это не так идеальное решение моей проблемы, можете ли вы предложить правильный способ ее решения?

Обратите внимание, что я не хочу объявлять указатель на каждую структуру (например, LRU *lruPtr;)

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Вместо этого вы можете использовать объединение:

union cache
{
    LRU lru;
    WS ws;
};

// ...

union cache *myCache = malloc(sizeof *myCache);
if(!strcmp(algorithm, "LRU")) {
    myCache->lru.i = 1;
}
1 голос
/ 15 января 2020

Вы можете сделать что-то подобное (вам нужно привести mStruct от void* к LRU*):

if(!strcmp(algorithm, "LRU")) {
    mStruct = malloc(sizeof(LRU));
    ((LRU*)mStruct)->i = 1;
}

Но такой код пахнет и использование объединений является лучшим вариантом.

...