C - ошибка компилятора: разыменование указателя на неполный тип - PullRequest
0 голосов
/ 13 мая 2018

Я видел здесь много вопросов о разыменовании указателей на неполные типы, но каждый из них связан с неиспользованием typedef или с объявлением структур в .c, а не в заголовочном файле. Я пытался исправить это в течение многих часов и, похоже, не могу найти способ.

stable.h (не может быть изменено):

typedef struct stable_s *SymbolTable;

typedef union {
    int i;
    char *str;
    void *p;
} EntryData;

SymbolTable stable_create();

stable.c:

SymbolTable stable_create() {
    SymbolTable ht = malloc(sizeof (SymbolTable));
    ht->data = malloc(primes[0] * sizeof(Node));
    for (int h = 0; h < primes[0]; h++) ht->data[h] = NULL;
    ht->n = 0;
    ht->prIndex = 0;
    return ht;
}

aux.h:

#include "stable.h"

typedef struct {
    EntryData *data;
    char *str;
    void *nxt;
} Node;


typedef struct {
    Node **data;
    int n;
    int prIndex;
} stable_s;

typedef struct {
    char **str;
    int *val;
    int index;
    int maxLen;
} answer;

freq.c:

answer *final;
static void init(SymbolTable table){
    final = malloc(sizeof(answer));
    final->val = malloc(table->n * sizeof(int));
}

int main(int argc, char *argv[]) {
    SymbolTable st = stable_create();
    init(st);
}

ошибка компилятора (с использованием флагов -Wall -std = c99 -pedantic -O2 -Wextra):

freq.c:13:30: error: dereferencing pointer to incomplete type ‘struct stable_s’
 final->val = malloc(table->n * sizeof(int));

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Как отмечает Эндрю, объявление "struct stable_s {...}" приведет к компиляции.

Однако вы не говорите, является ли это классовым присваиванием или реальным.Если в реальном мире, это, вероятно, очень плохая идея объявить структуру самостоятельно.Вам дают непрозрачный тип для использования для ссылки на библиотеку;Вы не должны знать или получить доступ к материалам внутри.Библиотека опирается на различную семантику, с которой вы можете столкнуться, и по мере изменения версий программного обеспечения содержимое структуры может (и почти наверняка изменится), так что ваш код в будущем сломается.

0 голосов
/ 13 мая 2018

Этот код

 typedef struct stable_s *SymbolTable;

определяет тип SymbolTable как указатель на struct stable_s.

Этот код

typedef struct {
    Node **data;
    int n;
    int prIndex;
} stable_s;

определяет структуру типаstable_s.Обратите внимание, что stable_s не является struct stable_s.

Простой

struct stable_s {
    Node **data;
    int n;
    int prIndex;
};

без typedef решит вашу проблему.

См. C:typedef struct name {...};VS typedef struct {...} name;

...