我有一个结构,我可以提供有关玩家的所有信息。那是我的结构:
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'
答案 0 :(得分:26)
这意味着包含main
的文件无法访问player
结构定义(即不知道它的外观)。
尝试将其包含在header.h
中,或者创建一个类似构造函数的函数,如果它是一个不透明的对象,则分配它。
如果您的目标是隐藏结构的实现,请在有权访问结构的C文件中执行此操作:
struct player *
init_player(...)
{
struct player *p = calloc(1, sizeof *p);
/* ... */
return p;
}
但是,如果不应隐藏实现 - 即main
应合法地说p->canPlay = 1
,最好将结构的定义放在header.h
中。
答案 1 :(得分:5)
错误的原因,例如“使用struct ...将sizeof应用于不完整类型”,总是缺少include语句。尝试找到要包含的正确库。
答案 2 :(得分:1)
尝试访问未初始化的extern数组的sizeof()
时,也会显示错误:
extern int a[];
sizeof(a);
>> error: invalid application of 'sizeof' to incomplete type 'int[]'
请注意,如果没有array size missing
关键字,您将收到extern
错误。
答案 3 :(得分:0)
我认为问题在于您将#ifdef
而不是#ifndef
放在header.h
文件的顶部。
答案 4 :(得分:0)
我是初学者,可能不会清除语法。 要引用上述信息,我仍然不清楚。
/*
* 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)
“ arrA”和“ arrB”均可访问(将其打印出来)。但是,无法获得“ arrB”的大小。
那里是什么问题?
在我的程序中,“ arrA”和“ arrB”是常量列表,在编译前已固定。我想使用标签(让我易于维护并节省RAM内存)。