我正试图隐藏我的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'
我现在在圈子里跑了好几个小时,需要有人清除我创造的混乱局面。如果我想动态地为结构内的数组分配内存,我怎么能事先定义结构?
答案 0 :(得分:4)
您必须首先在Board
中定义 Board.c
结构:
//Board.c
struct Board {
....
};
或者在#include
中Board.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)
。
此外,永远不会输入指针。不透明类型也不例外。