Подтвердить что ты не робот

Недопустимое применение 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'  
4b9b3361

Ответ 1

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

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

ИЗМЕНИТЬ

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

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

    /* ... */
    return p;
}

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

Ответ 2

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

Ответ 3

Похоже, что ваш главный не видит определения структуры игроков. Включен ли он в header.h?

Ответ 4

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

Ответ 5

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

extern int a[];
sizeof(a);
>> error: invalid application of 'sizeof' to incomplete type 'int[]'

Обратите внимание, что вы получите ошибку array size missing без ключевого слова extern.