ошибка: разыменование указателя на неполный тип - PullRequest
2 голосов
/ 31 августа 2010

у меня есть следующие части кода:

typedef struct Object* ObjectP;

ObjectP CreateObject(void *key) {

    printf("GOT %d\n",(*(int*) key));
    ObjectP objP = (ObjectP) malloc(sizeof(Object));
    if (objP == NULL) {
        //TODO ReportError(MEM_OUT);
        return NULL;
    }
    objP->_key = key;
    objP->_next = NULL;
    objP->_numInChain = 1;

    return objP;

}

typedef struct Object {
  ObjectP _next;
  void* _key;
  int _numInChain;
} Object;

и в другом файле:

void IntPrint(const void *key) {
    assert(key != NULL);
    printf("%d",*((const int*)key));
}

и в другом файле у меня есть main ():

int main(int argc, char* argv[]) {
 int* key = (int*) malloc(sizeof(int));
 *key = 20;
 ObjectP a = CreateObject(key);
 IntPrint(a->_key);  //THIS DOESN'T COMPILE
 return 0;
}

IntPrint не компилируется. это пишет:
ошибка: разыменование указателя на неполный тип
и я не могу понять почему, потому что IntPrint получает void *, а ключ -> _ также void *.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 31 августа 2010

Вы опубликовали кучу практически не относящихся к делу фрагментов кода, но упустили самый важный: что такое ObjectP и как оно определяется?Компилятор сообщает, что он определен как указатель на неполный тип.Это твоя проблема.Что именно не так с определением, невозможно сказать, фактически не увидев его.

После редактирования: Ваша проблема в том, что определение struct Object не видно в точке, где выпытаются получить доступ к a->key (т.е. в main).Вы либо забыли включить его, либо что-то в этом роде.Находится ли определение struct Object в том же заголовочном файле, что и определение ObjectP?

2 голосов
/ 31 августа 2010

Где вы определили ObjectP? Я предлагаю не объявлять его до того, как объект будет полностью определен:

typedef struct Object {
  struct Object*  _next;
  void* _key;
  int _numInChain;
} Object;

typedef Object* ObjectP;

Таким образом, всегда должно быть безопасно использовать ObjectP. Однако, если вы не публикуете больше кода, это только слепое предположение.

0 голосов
/ 31 августа 2010

Попробуйте следующее в вашей функции main:

IntPrint((const void *) a->_key);

Определение _key в структуре Object не имеет модификатора constant, и это может вызвать предупреждение или ошибку в зависимости от флагов, которые вы используете при компиляции.

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