c:不透明数据类型创建,“将sizeof'无效应用于不完整类型”

时间:2012-11-29 14:02:19

标签: c

我正试图隐藏我的struct的实现。结构的定义位于Board.h

typedef struct Board* BoardP;
typedef const struct Board* ConstBoardP;

我想根据需要在Board.c

中分配内存
#include <stdio.h>
#include <stdlib.h>
#include "Board.h"
#define TARGET_LENGTH 5
#define DEFAULT_BOARD_SIZE 10

 struct Board*
 newBoard(int r, int c)
{
    struct Board *b = (struct Board*) malloc(sizeof(struct Board));

     char ** array;
     int i;
     array = (char**) malloc( r*sizeof(char*) );
     for (i=0; i<r; i++)
     {
        array[i] = malloc( c*sizeof(char) );
     }
     b->_values = array;
     b->_last_player = 'X';
     b->_size_r = r;
     b->_size_c = c;
    return b;
}

但是我收到了错误:

  

将'sizeof'无效应用于不完整类型'struct Board'

enter image description here

我现在在圈子里跑了好几个小时,需要有人清除我创造的混乱局面。如果我想动态地为结构内的数组分配内存,我怎么能事先定义结构?

3 个答案:

答案 0 :(得分:4)

您必须首先在Board定义 Board.c结构:

//Board.c
struct Board {
 ....
};

或者在#includeBoard.c'的其他地方,无论如何,编译器需要在使用sizeof()时查看其定义以确定其大小并访问其成员。 Wikipedia Page也有一个例子。

答案 1 :(得分:2)

您似乎忘记了实际执行定义,它必须某处,对吗?

newBoard中的代码必须能够访问确切的定义,因为它正在执行以下操作:

b->_values = array;

必须声明struct Board类型的成员名为_values

另外,请don't cast the return value of malloc() in C。并且避免使用sizeof (char),这只是一种冗长的写作1的方式(当然,你不需要经常繁殖这些东西)。

答案 2 :(得分:1)

您不能在不透明(不完整)类型上使用sizeof

由于您使用的是动态分配,因此应考虑在opaque类型的init函数内移动分配,即:

Board* BoardInit (...)
{
  Board* something = malloc(...);

  return something ;
}

另一种方法是在board.h中声明一个全局常量extern const size_t sizeof_Board;,然后在board.c中将其定义为const size_t sizeof_Board = sizeof(Board)

此外,永远不会输入指针。不透明类型也不例外。