0

このコードをコンパイルすると、「不完全な型へのポインターを逆参照しています」というコンパイル エラーが発生します。最後の print ステートメントでエラーが発生し、その前に (*temp) を指定しようとしました。b のアドレスへの num

void main()
{

    struct {
        int xx;
        char *y;
        int * num;
        struct x *next;
    }x;

    struct x* temp;
    int b = 10;

    temp = ((struct x *)malloc(sizeof(x)));

    (*temp).num = &b;

    x.next = temp ;

    printf(" %d\n",temp->num, x.next->num);

}
4

5 に答える 5

5

問題は、次のステートメントです。

struct {
   ...
} x;

名前のないインスタンス 'x' を定義します。名前付きの型 'x' ではありません。

そのため、そこから「struct x」を参照すると、コンパイラーが知っているのは、タイプ「x」のポインターが必要であることだけです-これは後で定義します(決してしません)。

名前付きタイプ「x」を定義するには、次のものが必要です。

struct x {
   ...
};
于 2009-11-06T14:46:01.710 に答える
0

私はあなたが意味したと思います:

struct x {
  int xx;
  char *y;
  int * num;
  struct x *next;
}x;

使用する場所で定義していない「構造タグ」を参照しますstruct x。variable の型を参照する方法はありませんx。で参照したいのでstruct x、struct タグを定義する必要があります。

于 2009-11-06T14:46:21.613 に答える
0

構造体が完全に定義される前にそれ自体を参照しているという事実だと思います。

特に、構造体には名前がありません。「x」はそのような構造を持つ変数の名前ですが、型名はありません。

" " と宣言するだけstruct x { ... } xで問題ありません。

于 2009-11-06T14:48:26.073 に答える
0

ドラえもんが書いたものに加えてstruct x {...} x、私は次のような他のさまざまな小さな問題を自由に修正しましたprintf()

void main()
{
  struct x {
    int xx;
    char *y;
    int *num;
    struct x *next;
   } x;
   struct x* temp;
   int b = 10;
   temp = ((struct x *)malloc(sizeof(struct x)));
   (*temp).num = &b;
   x.next = temp ;
   printf("%d %d\n",*temp->num, *x.next->num);
}

好奇心から: 何を達成しようとしていますか?

于 2009-11-06T14:50:42.483 に答える
0

は、C または C++void main()の有効なプロトタイプではないことに注意してください。main

struct内で宣言しているへのポインタstructが必要な場合は、 にタグを付ける必要がありますstruct。は typedef便利な場合もありますが、必須ではありません。

あなたのコードと以下の違いを調べて、違いがある理由を理解してください。それはあなたが学ぶのに役立ちます。Cの FAQ リストも同様です(たとえば、構造、共用体、および列挙を参照してください。

#include<stdio.h>
#include<stdlib.h>

int main(void) {
    int b = 10;

    typedef struct x_struct {
        int xx;
        char *y;
        int *num;
        struct x_struct *next;
    } x;

    x *temp = malloc(sizeof(*temp));
    if ( !temp ) {
        return EXIT_FAILURE;
    }

    temp->num = &b;
    temp->next = temp;

    printf("%d %d\n", *(temp->num), *(temp->next->num));
    return 0;
}
于 2009-11-06T15:01:09.543 に答える