44

我有一个结构,其中放置了有关玩家的所有信息。那是我的结构:

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

6 回答 6

38

这意味着包含的文件main无权访问player结构定义(即不知道它的样子)。

header.h如果它是一个不透明的对象,请尝试将它包含在或创建一个类似构造函数的函数来分配它。

编辑

如果您的目标是隐藏结构的实现,请在可以访问该结构的 C 文件中执行此操作:

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

    /* ... */
    return p;
}

但是,如果不应该隐藏实现 - 即main应该合法地说p->canPlay = 1最好将结构的定义放在header.h.

于 2012-01-18T18:20:17.797 回答
7

诸如“Invalid application of sizeof to complete type with a struct ...”之类的错误的原因总是缺少包含语句。尝试找到要包含的正确库。

于 2014-04-26T08:53:26.500 回答
4

尝试访问sizeof()未初始化的外部数组时也会显示您的错误:

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

请注意,如果没有关键字,您会收到array size missing错误消息。extern

于 2018-03-30T09:05:44.923 回答
0

我认为问题在于你把#ifdef而不是放在文件#ifndef的顶部header.h

于 2012-07-04T19:16:41.120 回答
0

在这里聚会真的很晚了,但是上面提到的这个错误原因的一个特殊情况只是引用了一个带有 sizeof() 的结构,其中定义了结构:

int numElements = sizeof(myArray)/sizeof(myArray[0]);
.
.
.
myArray[] = 
{
    {Element1},
    {Element2},
    {Element3}
};
于 2022-02-08T23:21:32.840 回答
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”的大小。

那里有什么问题?

  1. 'char[]' 是不完整的类型吗?或者
  2. 'sizeof' 不接受外部变量/标签?

在我的程序中,“arrA”和“arrB”是常量列表,在编译之前已修复。我想使用一个标签(让我易于维护并节省 RAM 内存)。

于 2019-12-03T07:33:55.310 回答