C 胼胝体记忆
我正在尝试创建一个文件系统,需要调用文件描述符 假设我有两个定义如下的结构:C 胼胝体记忆,c,calloc,C,Calloc,我正在尝试创建一个文件系统,需要调用文件描述符 假设我有两个定义如下的结构: #define DESCRIPTOR_MAX (256) #define TABLE_MAX (32) typedef结构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; s
#define DESCRIPTOR_MAX (256)
#define TABLE_MAX (32)
typedef结构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));
但是当我想调用FS
结构中的fd_表时,问题就出现了。这是我正在尝试的
这一个不会产生错误:
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\u t[256]”不可分配
有人能向我解释一下我做错了什么,或者我在这个过程中是否完全错了?我甚至需要调用fd\u pos
?它看起来像fs->fd\u表。fd\u pos
是一个数组,而不是指针。如果需要动态数组,请将类型更改为size\u t*
否则,将其保留为数组而不使用动态分配是完全可以的。在这种情况下,如果要将内存归零(正如calloc
所做的那样),可以使用memset
:
memset( fs->fd_table.fd_pos, 0, sizeof(fs->fd_table.fd_pos) );
哦,是的,WhozCraig还指出,您的第一个示例是泄漏(分配内存,然后解引用和复制,然后丢失指针)。事实上,您不需要像我上面所建议的那样memset
,因为整个结构都是用第一个calloc
调零的,我们应该猜一下FS\u t
是什么吗?仅供参考,将任何未引用的分配放在单个语句中赋值的右侧都会导致内存泄漏。这:fs->fd_table=*(fd_table_t*)calloc(table_MAX,sizeof(fd_table_t))代码>毫无意义,而且在执行时会泄漏内存。哦,你知道,我忘记添加typedef了。我会编辑我的问题,我就是这么想的。它没有产生错误,但它感觉非常非常非常错误。啊!这就更有意义了。所以我可以避免使用memset,但是我应该如何编辑第一个calloc来避免内存泄漏呢?哦!第一个calloc!我不需要调用FS\u t
中的内容,因为最初的calloc负责调零,对吗?第一个calloc
是为8个结构分配和调零一些内存的结构(由FS
指出)。那个很好。另外两个callocs
不是必需的。事实上,它们只影响了这8个结构中的第一个。是的,这是有意义的。谢谢你的回复!