«ошибка: разыменование указателя на неполный тип» в c - PullRequest
1 голос
/ 22 августа 2011

Хорошо, я видел этот вопрос в Google миллион раз, но все еще не увенчался успехом. Я пытаюсь создать связанный список. Вот структура, определенная в List.c:

typedef struct List
{
    unsigned int size;
    ObjectP head;
} List;

Теперь, как вы заметите, и struct, и typedef называются LIST, что, насколько я знаю, хорошо. Но важно то, что структура НЕ анонимна.

Теперь в List.h (что, конечно, включено в List.c) я определил еще один typedef:

typedef struct List* ListP;

Что, насколько я понимаю, определяет ListP как указатель на структуру с именем List, точно так же, как я ее назвал.

И вот где я получаю ошибки:

void freeList(ListP list)
{
    ObjectP obj1;
    ObjectP obj2;
    if (list != NULL)
    {
        obj1 = list->head;
        while (obj1->next != NULL)   <---- HERE
        {
            obj2 = obj1;
            obj1 = obj1->next;   <---- HERE
        freeObject(obj2);
        }
    free(list);
    }
}

Я не понимаю, почему obj1 = list->head; в порядке, но везде я пытаюсь получить доступ к членам структуры, у меня есть эта ошибка. Как я уже сказал, я пытался найти его, но у других пользователей были ошибки, которые я не могу найти в своем коде. Спасибо!

РЕДАКТИРОВАТЬ: List.c также включает в себя Object.h, так что это не проблема. Определение объекта таково:

в Object.h у меня typedef struct Object* ObjectP; а в Object.c у меня

typedef struct Object
{
    void* key;
    ObjectP next;
} Object;

Все еще не знаю, в чем проблема!

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Похоже, вы определили структуру для ObjectP в другом C-файле (вероятно, Object.c).Когда компилятор компилирует List.c, он не знает ничего определенного в других файлах c, он знает только то, что было определено в h файлах, которые были включены в текущий файл c.

Структуры, которые совместно используются различными файлами c, должны быть определены в заголовочном файле, который может быть включен во все из них.Так что, если вы просто переместите определение для struct Object в Object.h, все будет в порядке.

0 голосов
/ 22 августа 2011

ObjectP определяется как указатель на Object, а Object имеет член типа ObjectP. Это круговая зависимость.

Попробуйте:

typedef struct object_st {
    void* key;
    struct object_st *next;
} Object;

typedef ObjectP *Object;

О, и отлиты для назначения:

obj1 = (ObjectP) obj1->next;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...