Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 胼胝体记忆_C_Calloc - Fatal编程技术网

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个结构中的第一个。是的,这是有意义的。谢谢你的回复!