使用结构将sizeof应用于不完整类型无效

时间:2012-01-18 18:18:57

标签: c struct calloc

我有一个结构,我可以提供有关玩家的所有信息。那是我的结构:

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'  

5 个答案:

答案 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”的大小。

那里是什么问题?

  1. 'char []'类型不完整吗?或
  2. 'sizeof'不接受extern变量/标签吗?

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