Разыменование указателя на неполный тип структуры в структуре назначения для члена - PullRequest
0 голосов
/ 19 сентября 2018

Я столкнулся с проблемой, связанной с указателем и структурой.

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

Определите две структуры: подтерм и основной термин.

typedef struct{
    int sub_id;
    int sub_data;
    struct sub_term *next_term;
}sub_term;

typedef struct{
    char name[10];
    struct sub_term *init_term;
    struct sub_term *current_term;
}major_term;

Я хочу создать основной термин, который содержит подпунктterm.

int main(void){

major_term *Test_1;
Test_1 = (major_term *)malloc(sizeof(major_term));

Test_1->init_term = (sub_term *)malloc(sizeof(sub_term));   
Test_1->current_term = Test_1->init_term;

printf("Sub term 1 id : ");

Однако компилятор замечает, что в этой строке «разыменование указателя на [неполный тип» [Ошибка] в этой строке.

scanf("%d",&Test_1->current_term->sub_id);

Я новичок в языке C и не уверен, чтопричина.Спасибо за ваши рекомендации, которые делают мой код лучше!

printf("Sub term 1 id : ",Test_1->current_term->sub_id);
printf("Sub term 1 data: ");
scanf("%d",&Test_1->current_term->sub_data);
printf("Sub term 1 data : ",Test_1->current_term->sub_data);    

return 0;
}

1 Ответ

0 голосов
/ 19 сентября 2018

Вам нужны имена для структур, а не просто typedefs:

typedef struct sub_term{
//             ^^^^^^^^
    int sub_id;
    int sub_data;
    struct sub_term *next_term;
}sub_term;

typedef struct major_term{
//             ^^^^^^^^^^
    char name[10];
    struct sub_term *init_term;
    struct sub_term *current_term;
}major_term;

Определение имен типов с помощью typedef вот так

typedef struct {} MyType;

не определяет структуру с именем MyType.Вместо этого он определяет имя MyType как псевдоним неназванной структуры.

Имена структур и имена общих типов находятся в двух отдельных пространствах имен в C, поэтому struct MyType отличается от MyType, и онине мешайте друг другу.

Когда вы объявляете структуру, не определяя ее (т. е. предоставляя содержимое структуры), структура имеет неполный тип.В своем коде вы определили указатели на struct sub_term, но вы не определили эту структуру (обратите внимание: typedef -ing не дает имен структурам - он определяет псевдонимы для ваших неназванных структур), поэтому компилятор жалуется на "незавершенные типы ".

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