我正在尝试创建一个文件系统,我需要调用文件描述符。
假设我有两种具有以下定义的结构:
#define DESCRIPTOR_MAX (256)
#define TABLE_MAX (32)
typedef struct S16FS S16FS_t;
typedef struct {
bitmap_t *fd_status;
size_t fd_pos[DESCRIPTOR_MAX];
inode_ptr_t fd_inode[DESCRIPTOR_MAX];
} fd_table_t;
struct FS {
back_store_t *bs;
fd_table_t fd_table;
};
我正在调用一个没有问题的新文件系统:
FS_t *fs = (FS_t *)calloc(8, sizeof(FS_t));
但是当我想在fd_table
结构中调用FS
时,我的问题就出现了。这就是我正在尝试的。
这个没有产生任何错误:
fs->fd_table = *(fd_table_t*)calloc(TABLE_MAX, sizeof(fd_table_t));
我收到以下错误:
fs->fd_table.fd_pos = (size_t *)calloc(TABLE_MAX, sizeof(size_t));
错误:数组类型'size_t [256]'不可分配
有人可以向我解释我做错了什么,或者我的过程中是否完全错了?我甚至需要calloc fd_pos
?
答案 0 :(得分:1)
看起来fs->fd_table.fd_pos
是一个数组,而不是一个指针。如果需要动态数组,请将类型更改为size_t*
。
否则,将它保留为数组并且不使用动态分配是完全正常的。在这种情况下,如果你想将内存归零(如calloc
那样),你可以使用memset
:
memset( fs->fd_table.fd_pos, 0, sizeof(fs->fd_table.fd_pos) );
哦,是的,还有WhozCraig指出你的第一个例子是泄漏(分配内存,然后解除引用和复制,然后丢失指针)。实际上,您不需要像我上面建议的那样memset
,因为整个结构已被第一个calloc
归零。