调用内存

时间:2016-04-07 02:06:24

标签: c calloc

我正在尝试创建一个文件系统,我需要调用文件描述符。

假设我有两种具有以下定义的结构:

#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

1 个答案:

答案 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归零。