I have a struct where I put all the information about the players. That's my struct:
struct player{ int startingCapital; int currentCapital; int startingPosition; int currentPosition; int activePlayer; int canPlay; }; And that's my main:
#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; } I'm asking the user to give the number of players and then I try to allocate the needed memory. But I'm getting this compiler error that I can't figure out:
invalid application of `sizeof' to incomplete type `player' 36 Answers
It means the file containing main doesn't have access to the player structure definition (i.e. doesn't know what it looks like).
Try including it in header.h or make a constructor-like function that allocates it if it's to be an opaque object.
EDIT
If your goal is to hide the implementation of the structure, do this in a C file that has access to the struct:
struct player * init_player(...) { struct player *p = calloc(1, sizeof *p); /* ... */ return p; } However if the implementation shouldn't be hidden - i.e. main should legally say p->canPlay = 1 it would be better to put the definition of the structure in header.h.
The cause of errors such as "Invalid application of sizeof to incomplete type with a struct ... " is always lack of an include statement. Try to find the right library to include.
Your error is also shown when trying to access the sizeof() of an non-initialized extern array:
extern int a[]; sizeof(a); >> error: invalid application of 'sizeof' to incomplete type 'int[]' Note that you would get an array size missing error without the extern keyword.
Really late to the party here, but a special case of the reasons for this error cited above would simply be to reference a structure with sizeof() above where the structure is defined:
int numElements = sizeof(myArray)/sizeof(myArray[0]); . . . myArray[] = { {Element1}, {Element2}, {Element3} }; I think that the problem is that you put #ifdef instead of #ifndef at the top of your header.h file.
I am a beginner and may not clear syntax. To refer above information, I still not clear.
/* * main.c * * Created on: 15 Nov 2019 */ #include <stdio.h> #include <stdint.h> #include <string.h> #include "dummy.h" char arrA[] = { 0x41, 0x43, 0x45, 0x47, 0x00, }; #define sizeA sizeof(arrA) int main(void){ printf("\r\n%s",arrA); printf("\r\nsize of = %d", sizeof(arrA)); printf("\r\nsize of = %d", sizeA); printf("\r\n%s",arrB); //printf("\r\nsize of = %d", sizeof(arrB)); printf("\r\nsize of = %d", sizeB); while(1); return 0; }; /* * dummy.c * * Created on: 29 Nov 2019 */ #include <stdio.h> #include <stdint.h> #include <string.h> #include "dummy.h" char arrB[] = { 0x42, 0x44, 0x45, 0x48, 0x00, }; /* * dummy.h * * Created on: 29 Nov 2019 */ #ifndef DUMMY_H_ #define DUMMY_H_ extern char arrB[]; #define sizeB sizeof(arrB) #endif /* DUMMY_H_ */ 15:16:56 **** Incremental Build of configuration Debug for project T3 **** Info: Internal Builder is used for build gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.c" In file included from ..\main.c:12: ..\main.c: In function 'main': ..\dummy.h:13:21: **error: invalid application of 'sizeof' to incomplete type 'char[]'** #define sizeB sizeof(arrB) ^ ..\main.c:32:29: note: in expansion of macro 'sizeB' printf("\r\nsize of = %d", sizeB); ^~~~~ 15:16:57 Build Failed. 1 errors, 0 warnings. (took 384ms) Both "arrA" & "arrB" can be accessed (print it out). However, can't get a size of "arrB".
What is a problem there?
- Is 'char[]' incomplete type? or
- 'sizeof' does not accept the extern variable/ label?
In my program, "arrA" & "arrB" are constant lists and fixed before to compile. I would like to use a label(let me easy to maintenance & save RAM memory).
2