C - Разыменование указателя на неполный тип - PullRequest
2 голосов
/ 07 марта 2012

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

struct graph {
    int cap;
    int size;
};

.h

typedef struct graph graph_t;

Спасибо!

Ответы [ 4 ]

3 голосов
/ 07 марта 2012

Вы не можете сделать это, так как структура определена в другом исходном файле. Смысл typedef в том, чтобы скрыть данные от вас. Возможно, есть такие функции, как graph_cap и graph_size, которые вы можете вызвать и которые вернут вам данные.

Если это ваш код, вы должны определить struct graph внутри файла заголовка, чтобы все файлы, содержащие этот заголовок, могли иметь его определение.

1 голос
/ 07 марта 2012

Когда компилятор компилирует main.c, он должен иметь возможность видеть определение struct graph, чтобы он знал, что существует член с именем cap. Необходимо переместить определение структуры из файла .c в файл .h .

Альтернативный метод, если вам нужно, чтобы graph_t был непрозрачным типом данных , - это создание функций доступа, которые принимают указатель graph_t и возвращают значение поля. Например,

graph.h

int get_cap( graph_t *g );

graph.c

int get_cap( graph_t *g ) { return g->cap; }
0 голосов
/ 07 марта 2012

lala.c

#include "lala.h"

int main(int argc, char** argv) {
    //graph_t * g = graph_create(128); //I commented this line out to make sure graph_create was not causing this.
    graph_t * g;
    g->cap; //This line gives that error.
    return 1;
}

lala.h

#ifndef LALA_H
#define LALA_H

struct graph {
    int cap;
    int size;
};

typedef struct graph graph_t;

#endif

Компилируется без проблем с:

gcc -Wall lala.c -o lala
0 голосов
/ 07 марта 2012

Должно быть, у вас есть определенные вещи.Строка typedef должна отображаться в заголовочном файле, который включен в файл с main ().

В противном случае он работал нормально для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...