2016-04-07 8 views
-1

ファイルシステムを作成しようとしていますが、ファイル記述子をcallocする必要があります。呼び出しメモリ

のは、私は次の定義を持つ2つの構造があるとしましょう:

#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; 
}; 

私は問題なく新しいファイルシステムをcallocingよ:

FS_t *fs = (FS_t *)calloc(8, sizeof(FS_t)); 

が、私が電話したいときに私の問題が発生するfd_tableFS構造体。ここに私がしようとしているものがあります。

この1つはエラーを生成しません:

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)); 

error: array type 'size_t [256]' is not assignable

誰かが私が間違っている場合、またはてるものを私に説明できます私は私のプロセスでは完全に間違っていますか? fd_posを呼び出す必要がありますか?

+2

「FS_t」は何ですか?また、Fyiは、1つのステートメントで代入の右側に逆参照を配置することは、メモリリークのためのレシピです。これは: 'fs-> fd_table = *(fd_table_t *)calloc(TABLE_MAX、sizeof(fd_table_t));'は全く意味を持たず、その間にメモリをリークします。 – WhozCraig

+0

あなたは知っている、私はtypedefを追加することを忘れていた。私は自分の質問を編集します –

+0

それは私が考えたものです。それは間違いを起こさなかったが、ひどく間違っていた。 –

答えて

1

は、ポインタではなく配列です。動的配列が必要な場合は、型をsize_t*に変更します。

それ以外の場合は、配列としてそのまま残して、動的割り当てを使用しないでください。あなたは(callocがするように)メモリをゼロにしたい場合はその場合は、あなただけmemsetを使用することができます。

memset(fs->fd_table.fd_pos, 0, sizeof(fs->fd_table.fd_pos)); 

あなたの最初の例は、その後、メモリを割り当てる(リークであることを指摘ああ、ともWhozCraig逆参照とコピー、続いてポインタの消失)。実際には、構造全体が最初にcallocでゼロ化されているので、上記のようにmemsetは必要ありません。

+0

ああ!それははるかに理にかなっています。だから私はmemsetの使用を避けることができますが、どのようにメモリリークを避けるために最初のcallocを編集する必要がありますか? –

+0

OH!最初のcalloc!最初のcallocがzero-ingを処理したので、 'FS_t'の中にあるものを呼び出す必要はありません。 –

+1

最初の 'calloc'は、8つの構造体(' fs'が指し示す)のためにいくつかのメモリを割り当ててゼロを割り当てるものです。それは大丈夫です。他の2つの 'calloc'は必須ではありません。実際、彼らはとにかくこれらの8つの構造のうち最初のものにしか影響しませんでした。 – paddy

関連する問題