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