Недопустимое применение sizeof к неполному типу со структурой


У меня есть структура, куда я помещаю всю информацию об игроках. Это моя структура:

struct player{
   int startingCapital;
   int currentCapital;
   int startingPosition;
   int currentPosition;
   int activePlayer; 
   int canPlay;      
};

И это мое главное:

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


int main(int argc, char *argv[])
{  int s,i,numOfPlayers;
   struct player *players;
    printf("Give the number of players: n");
    scanf("%d",&numOfPlayers);

    players = (struct player *)calloc(numOfPlayers,sizeof(struct player));


   system("PAUSE"); 
  return 0;
}
Я прошу пользователя указать количество игроков, а затем пытаюсь выделить необходимую память. Но я получаю эту ошибку компилятора, которую я не могу понять:
invalid application of `sizeof' to incomplete type `player'  
4 26

4 ответа:

Это означает, что файл, содержащий main, не имеет доступа к определению структуры player (т. е. не знает, как оно выглядит).

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

EDIT

Если ваша цель-скрыть реализацию структуры, сделайте это в файле C, который имеет доступ к структуре:

struct player *
init_player(...)
{
    struct player *p = calloc(1, sizeof *p);

    /* ... */
    return p;
}

Однако, если реализация не должна быть скрыта-т. е. main должен юридически скажем, p->canPlay = 1 было бы лучше поместить определение структуры в header.h.

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

Я думаю, что проблема в том, что вы ставите #ifdef вместо #ifndef в верхней части вашего файла header.h.

Ваша ошибка также отображается при попытке доступа к sizeof() неинициализированного массива extern:

extern int a[];
sizeof(a);
>> error: invalid application of 'sizeof' to incomplete type 'int[]'
Обратите внимание, что вы получите ошибку array size missing без ключевого слова extern.