43

次のように定義された構造体があります。

struct {
 char name[32];
 int  size;
 int  start;
 int  popularity;
} stasher_file;

これらの構造体へのポインターの配列:

struct stasher_file *files[TOTAL_STORAGE_SIZE];

私のコードでは、構造体へのポインターを作成し、そのメンバーを設定して、配列に追加しています。

 ...
 struct stasher_file *newFile;
 strncpy(newFile->name, name, 32);
 newFile->size = size;
 newFile->start = first_free;
 newFile->popularity = 0;
 files[num_files] = newFile;
 ...

次のエラーが表示されます。

エラー: 不完全な型へのポインターを逆参照しています

内部のメンバーにアクセスしようとするたびにnewFile。私は何を間違っていますか?

4

6 に答える 6

53

最初の定義で定義していませんstruct stasher_file。定義したのは、名前のない構造体型とその型の変数stasher_fileです。コードのような型の定義がないためstruct stasher_file、コンパイラは不完全な型について不平を言います。

を定義するstruct stasher_fileには、次のようにする必要があります

struct stasher_file {
 char name[32];
 int  size;
 int  start;
 int  popularity;
};

stasher_file名前が定義内のどこに配置されているかに注意してください。

于 2010-04-05T01:49:29.527 に答える
13

newFileスペースを割り当てずにポインターを使用しています。

struct stasher_file *newFile = malloc(sizeof(stasher_file));

また、構造体名を先頭に置く必要があります。stasher_file を指定した場所は、その構造体のインスタンスを作成することです。

struct stasher_file {
    char name[32];
    int  size;
    int  start;
    int  popularity;
};
于 2010-04-05T01:45:13.483 に答える
11

実際にどのように構造を定義したのですか? もしも

struct {
  char name[32];
  int  size;
  int  start;
  int  popularity;
} stasher_file;

は型定義と見なされますが、 がありませんtypedef。上記のように記述すると、実際には という名前の変数を定義しますstasher_file。その型は匿名の構造体型です。

試す

typedef struct { ... } stasher_file;

(または、他の人がすでに述べたように):

struct stasher_file { ... };

後者は実際にタイプの使用に一致します。struct最初の形式では、前の変数宣言を削除する必要があります。

于 2010-04-05T01:50:09.680 に答える
5

上記のケースは新しいプロジェクトの場合です。確立されたライブラリのフォークを編集しているときに、このエラーに遭遇しました。

編集中のファイルには typedef が含まれていましたが、構造体は含まれていませんでした。

最終結果は、間違った場所で構造体を編集しようとしていたということです。

同様の方法でこれに遭遇した場合は、構造体が編集されている他の場所を探して、そこで試してください。

于 2011-05-11T19:27:23.623 に答える
1

そのエラーが発生する理由は、次のように宣言したためですstruct

struct {
 char name[32];
 int  size;
 int  start;
 int  popularity;
} stasher_file;

これは型を宣言していませんstasher_fileこれは匿名 型を宣言しており、structという名前のグローバル インスタンスを作成していますstasher_file

あなたが意図したのは:

struct stasher_file {
 char name[32];
 int  size;
 int  start;
 int  popularity;
};

ただし、Brian R. Bondy の応答はエラー メッセージについて正しくありませんでしたが、structスペースを割り当てずに に書き込もうとしているという彼の意見は正しいことに注意してください。構造体へのポインターの配列が必要な場合は、呼び出してそれぞれにスペースを割り当てるstruct stasher_file必要があります。malloc

struct stasher_file *newFile = malloc(sizeof *newFile);
if (newFile == NULL) {
   /* Failure handling goes here. */
}
strncpy(newFile->name, name, 32);
newFile->size = size;
...

(ところで、使用するときは注意しstrncpyてください。NUL 終了が保証されているわけではありません。)

于 2010-04-05T01:52:38.603 に答える
0

その理由は、 type を宣言しなかったためです 。代わりにstruct stasher_filestruct 変数を定義しています。stasher_file

ではC、構造の宣言:

    struct structure-tag {
        member1
        member2
        ...
    };

structure-tagキーワードに続くオプションの名前ですstruct。宣言後、変数を定義できます。

    struct structure-tag var1, *var2;

また、次のように宣言と定義の両方を行うことができます。

    struct structure-tag {
        member1
        member2
        ...
    } var1, *var2;

したがって、あなたの場合、これを試すことができます:

struct stasher_file {
 char name[32];
 int  size;
 int  start;
 int  popularity;
} *files[TOTAL_STORAGE_SIZE];

struct stasher_file *newFile = malloc(sizeof(struct stasher_file));

... other code ...

それで全部です。

于 2021-12-09T05:08:32.340 に答える