2014-11-16 2 views
-2

Я новичок в программировании на С.указатель дефрагментации на неполный тип

Так что это в моем файле заголовка

typedef struct Rec *node; 

Это в моем C File

#include <stdio.h> 
#include <stdlib.h> 
#include "header.h" 

typedef struct Rec *List; 
typedef struct Listing{ 

    node *items; 
    int numelems; 
    struct List *next; 

}Listing; 

int sum(List L) 
{ 
    if(L->items == NULL) 
    { 
     return NULL; 
    } 
    return (L->head + sum(L->tail)); 
} 

int main(void) 
{ 
    return 1; 
} 

Я получаю эту ошибку, когда он говорит разыменования указателя к неполному типу в if(L->items == NULL). Я знаю, что это в моей структуре, но я не знаю, как это исправить. Я пробовал проб и ошибок, но я хотел бы понять, что и где моя ошибка.

PS: эта программа предназначена только для меня.

+3

Что в 'header.h'? Определяет ли он 'struct Rec' или' struct List'? Если нет, в этом проблема - ваш параметр 'List' является' struct Rec * ', и если вы еще не определили' struct Rec', у вас возникли проблемы. Ваш 'struct Listing' содержит' struct List * ', который также является указателем на другой тип. Обратите внимание, что в вашем коде тип 'List' не связан с типом' struct List'. –

+1

'typedef struct Rec * node;' - ** no no no no please no! ** Не скрывайте указатели позади (вводящим в заблуждение по-разному) 'typedef's! –

ответ

0

Если в вашем заголовке есть только typedef struct Rec *node;, тогда это проблема. Вы не указали struct Rec или struct List в любом месте. Вы сказали, что они существуют, но это все. Это делает их неполными, и вы не можете разыменовывать неполный тип структуры, потому что компилятор не знает, какие члены находятся в неполном типе структуры.

Ваш List параметр struct Rec * скрыт, и если вы не указали struct Rec в любом месте, у вас возникли проблемы. Ваш struct Listing содержит struct List *, который также является указателем на другой тип. Обратите внимание, что в вашем коде тип List не связан с типом struct List. И обратите внимание, что node и List являются и псевдонимами для типа struct Rec *.

Ваш код в sum() ссылается на элемент указателя List структуры head и tail, так что ваш struct Rec должен содержать эти имена.

В целом, лучше всего сохранить теги структуры и typedef имена, близкие друг другу. То есть:

typedef struct Node Node; 

но не:

typedef struct Angel Elephant; 

Кроме того, по общему мнению, что лучше не вставлять указатели в typedef. То есть, это нормально писать typedef сек и выше, но не нормально использовать:

typedef struct Fish *Fish; 

Например, см Is it a good idea to typedef pointers?

Смежные вопросы