Неверное применение sizeof к неполному типу со структурой - PullRequest
27 голосов
/ 18 января 2012

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

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 голосов
/ 18 января 2012

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

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

EDIT

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

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

    /* ... */
    return p;
}

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

5 голосов
/ 26 апреля 2014

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

1 голос
/ 30 марта 2018

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

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

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

0 голосов
/ 04 июля 2012

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

...