Как уже отмечали многие, у вас есть проблема, потому что при использовании typedef вы зашли слишком далеко :-).Использование typedef
для преобразования типов предназначено для повышения ясности, тогда как способ его использования уменьшает ясность.
Позвольте мне сначала показать ваш пример с правильным подходом:
#include <stdio.h>
#include <stdlib.h>
struct player {
char letter;
int age;
};
/* typedef struct player *player_t; NOT NEEDED */
int main (void)
{
struct player *p;
p = malloc(sizeof(*p)); /* used *p for sizeof instead of struct player */
if (p == NULL)
{
fprintf(stderr, "Unable to allocate memory\n");
return 1;
}
p->letter = 'A';
p->age = '9';
free(p);
return 0;
}
Когда использовать typedef foo_t bar_t
Когда это проясняет ситуацию, например, stdint.h делает это для целых чисел.Скажем, вам нужно 32-битное целое число без знака, вы должны использовать uint32_t, который соответственно typedef'd для различных архитектур, чтобы дать вам то, что вы ожидаете.
Когда НЕ использовать typedef struct foo foo_t
Почти все время.
Когда можно использовать typedef struct foo foo_t
Теперь, по причинам, связанным с изменениями, typedef struct foo foo_t
не рекомендуется, за исключением случаев, когда struct foo непрозрачна, как правило, когда вынаписание C API, где структура доступна через предопределенные функции доступа, которые имеют более длительный срок службы, чем внутренняя структура.
Зачем использовать sizeof (* p) вместо sizeof (struct player)?
InВ этом случае по какой-то причине вы решаете изменить то, что *p
, тогда все, что вам нужно сделать, это изменить объявление, и не беспокоиться о том, что оно не будет выделено соответствующим образом.