1

C で構造体のリストを作成したいと考えています。私のプログラムでは、ファイルから行を読み取り、情報を構造体に格納します (1 行に 1 つの構造体)。だから私のコードは次のようなものです:

struct myStruct *myStructList;

// Here is the parsing thing

そして、解析の最後に、次のことを試みます。

myStructList[i] = NULL;

ここで、i はリスト内の次の空き位置です (これはすでに realloc で予約されています)。

これは私が得ているエラーです。

incompatible types when assigning to type ‘struct myStruct’ from type ‘void *’

NULL はできないようです。私の質問は次のとおりです。NULL でない場合、そこに何を入れることができますか? リストが完成したことをどうやって知ることができますか? リスト内の要素数でカウンターを保持できることはわかっていますが、それは避けたいと思います。

4

2 に答える 2

4

C では、Java とは異なり、配列は要素を参照ではなく値で保持します。

したがって、ポインター (アドレス) を構造体に割り当てようとしていますが、この操作は定義されていないため、このエラーが発生します。

要素を に設定する場合NULLは、配列を として宣言し、struct mySTruct*[]値の代わりにポインターを割り当てる必要があります。

于 2012-05-31T16:57:36.170 に答える
1

struct myStruct *myStructList;タイプ の 1 つまたは複数のオブジェクトへのポインタを定義しますstruct myStructNULL任意のポインター型に暗黙的に変換できることが保証されている定数です。struct myStructポインタ型ではありません。

エンド センチネルを使用してアレイの終了を知らせる一般的な方法が 2 つあります。1 つ目は、へのポインタの配列を使用することstruct myStructです。このようにして、NULL ポインタをエンド センティネルとして使用できます。

もう 1 つのオプションでは、 に明示的な NULL 値が必要ですstruct myStruct。したがって、次のように NULL 初期化子を定義できます (C99 以降が必要です)。

#define MYSTRUCT_NULL ((struct myStruct){ /* NULL initializer */ })
struct myStruct *myStructList = /* ... */
myStructList[i] = MYSTRUCT_NULL;

最後のセンチネルを見つけるには、配列の内容を MYSTRUCT_NULL と具体的に比較する必要があります。

于 2012-05-31T17:26:28.373 に答える