1

我试图隐藏我的结构的实现。结构的定义位于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' 的无效应用</p>

在此处输入图像描述

我现在在圈子里跑了几个小时,需要有人来清理我造成的混乱。如果我想动态地为结构内的数组分配内存,我该如何事先定义结构?

4

3 回答 3

4

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

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

或者在其他地方,#include无论如何Board.c,编译器需要查看它的定义以确定它在使用sizeof()和访问它的成员时的大小。维基百科页面中也有一个示例。

于 2012-11-29T14:05:09.767 回答
2

您似乎忘记了实际进行定义,它必须去某个地方,对吗?

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

b->_values = array;

必须声明该struct Board类型有一个名为_values.

另外,请不要malloc()在 C中转换返回值。并且避免使用sizeof (char),这只是一种冗长的写作方式1(当然,您不需要经常乘以这种方式)。

于 2012-11-29T14:07:02.350 回答
1

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

由于您使用的是动态分配,因此您应该考虑将分配移动到不透明类型的 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).

此外,永远不要 typedef away pointers。不透明类型也不例外。

于 2012-11-29T14:54:40.393 回答