2016-03-29 12 views
-1

私は、.isoファイルシステムのファイルに対してls関数を実装することを任されています。私はフリードを使用する必要がありますが、それはsegfaultingです。私はファイルが存在することを知っていて、それにはデータがあることが分かっています。私はfreadを呼び出すための形式を持っており、次のように設定しました。なぜfread segfaultですか?

static void ls(File *file, int32_t root_dir_size) 
{ 
    void* sector; 
    int result; 
    result = fread(sector, 1, 1, file); 
} 

なぜこのsegfaultですか?私はCの新人です.C++から来ているので、私がここで何が欠けているのかは分かりません。

+2

「セクタ」は初期化されていません。 'File' - >' FILE'ですか? – BLUEPIXY

+0

C++でも同じ問題があります。 – Olaf

+0

**セクター**は空のストレージ領域を指す必要があります。 ** malloc()**の配列またはメモリブロック。 –

答えて

1

freadには、読み込んでいるデータを格納するメモリが必要です。そのメモリは、あなたのケースの最初のパラメータsectorによって示されます。ただし、sectorは初期化されていません。いくつかのメモリを割り当てる必要があります。この場合は1バイトで、sectorがそれを指しています。たとえば、

void *sector = malloc(1); 

いつものように、使用した後でメモリを解放することを忘れないでください。

+0

説明をいただきありがとうございます。だから私はいつもメモリを割り当てる必要があるポインタを宣言してCで、またはこれはちょうど無効なポインタの場合ですか? – user3577756

+0

ポインタは、何か、mallocされたメモリ、既存の変数、さらには関数を指すようにすることができます。割り当てられたメモリを使用するのがおそらく最も一般的です。それはかなり珍しいので、実際にはvoidポインタを宣言します。ほとんどのポインタは型付けされています(プリミティブ型、構造体など)。 'fread'は、指し示されたメモリにバイト単位でデータを書き込むだけなので、voidポインタをとります。 'void'は、ポインタの型が問題ではないことを示すために使用されています。何らかのポインタを使用するだけです。 –

+0

特に何かを指すことができるvoidポインタを参照していますか? – user3577756

関連する問題