Структура объявлена ​​в заголовочном файле C - ошибка gcc malloc - PullRequest
1 голос
/ 29 октября 2019

Я объявил структуру typedef для заголовочных файлов следующим образом:

myheader.h

typedef struct mystruct mystruct;

myheader.c

typedef struct mystruct{
    double *ptr1;
    double *ptr2;
    int *ptr3;
    mystruct *ptr4;
    mystruct *ptr5;
}mystruct;

program.c

#include "myheader.h"
int main()
{
mystruct *A = (mystruct *)malloc(sizeof(mystruct));
} 

, когда я пытаюсь скомпилировать, используя:

gcc -o myprogram myprogram.c myheader.c

я получаю следующую ошибку:

error: invalid application of ‘sizeof’ to incomplete type ‘mystruct’ {aka ‘struct mystruct’}

    mystruct * A = (mystruct *)malloc(sizeof(mystruct));


Что-то не так с моим кодом или я неправильно компилирую?

1 Ответ

2 голосов
/ 29 октября 2019

Как @someprogrammerdude уже указал в своем комментарии о единицах перевода : когда компилятор компилирует main.c, он знает только о main.c и включенных заголовках. Так что все, что он знает, это то, что существует структура typedef, помеченная как mystruct, но она ничего не знает о своем содержимом и, следовательно, не может определить размер ts, поэтому вы не можете использовать sizeof(). По той же причине, по которой вы не могли получить доступ ни к каким элементам структуры, int *p = mystruct->ptr3;или mystruct->ptr1 = &mydouble; также не будет компилироваться.

Тем не менее, этот дизайн довольно распространен. Давайте предположим, что вы хотите инкапсулировать каждый доступ к mystruct аналогично ОО. Затем у вас есть источник, скажем, mystruct.c, где вы на самом деле определяете структуру (как вы это сделали в myheader.c) и предоставляете все необходимые функции получения и установки (включая функцию выделения). Затем в любом другом источнике вы могли бы передавать указатели структуры любым удобным вам способом, но для всего остального вы должны использовать назначенные функции.

Преимущество этого подхода заключается в том, что в будущем вы можете изменять структуру без необходимости перекомпилировать каждый источник, который ее использует.

...