Недопустимое применение 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'
Ответы
Ответ 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
.