4

WindowsでMinGWを使用しています。私はリンクリストを作成していますが、これと混同しています。

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

typedef struct Data
{
    int x;
    int y;
    struct BlaBla * next;               /*compiles with no problem*/
}List;

int main(void)
{
    List item;
    List * head;
    head = NULL;
    return 0;
}

これで、構造体は構造体変数(オブジェクト、その構造体のインスタンス)を持つことはできませんが、その構造体タイプのポインターを持つことはできます。ポインタが存在しない型のポインタになり得ることを知りませんでした。;(リンクリストではなく、一般的な話を意味するstruct BlaBla * next必要があります)struct Data * next

4

4 に答える 4

6

はい、できます。コンパイラは、不明な型名に初めて遭遇したときに、この名前の構造体型定義が存在すると想定するためです。次に、構造体名を前方宣言し、ポインターとして使用できるようにしますが、逆参照したり、ポインター演算を実行したりすることはできません(不完全な型であるため)。

于 2013-03-20T05:26:19.493 に答える
3

コンパイラは、次のようなコードを受け入れます。

typedef struct Data
{
    int x;
    int y;
    struct BlaBla * next;               /*compiles with no problem*/
}List;

ポインタのサイズはコンパイラに認識されており、コンパイラは構造体が逆参照される前に定義されると想定しているため、これは問題ありません。

コンパイラはこのように動作するため、次のことが可能です。

typedef struct Data
{
    int x;
    int y;
    struct Data * next;     /* points to itself */
} List;

ただし、次のように構造体をインラインで含める場合は、次のようになります。

typedef struct Data
{
    int x;
    int y;
    struct BlaBla blaStruct;               /* Not a pointer. Won't compile. */
}List;

コンパイラは、その大きstruct Dataさがわからないため、その大きさを計算できませんstruct BlaBla。これをコンパイルするには、の定義を含める必要がありますstruct BlaBla

のメンバーにアクセスする必要があるとすぐに、struct BlaBlaそれを定義するヘッダーファイルをインクルードする必要があることに注意してください。

于 2013-03-20T05:31:53.550 に答える
0

それはあなたが「存在しない」とはどういう意味かによります。宣言 すらしていない場合BlaBlaは、エラーが発生します。

宣言したがまだ定義していない場合は、正常に機能します。不完全な型へのポインタを持つことができます。

実際、これはCで不透明なポインターを実行する通常の方法です。

struct BlaBlaしたがって、スコープ内の宣言がないため、これは無効であると考えるかもしれません。

typedef struct Data {
    struct BlaBla *next;  // What the ??
} List;

struct BlaBlaただし、宣言と定義の両方をnext同時に行うため、実際には問題ありません。

もちろん、定義は宣言を意味するので、これも問題ありません。

struct BlaBla { int xyzzy; };
typedef struct Data {
    struct BlaBla *next;  // What the ??
} List;
于 2013-03-20T05:26:18.010 に答える
0

特定のタイプの変数またはフィールドを宣言する、パラメーターとして渡す、または同じタイプの別のフィールドにコピーするために、コンパイラーは、変数またはフィールドが占めるバイト数、それが持つアライメント要件を知る必要があります( any)、および互換性のある他のポインタータイプですが、コンパイラーが知る必要があるのはそれだけです。Cのすべての一般的な方言では、構造体へのポインターは常に同じサイズであり、それが指す構造体のサイズやその構造体に含まれるものに関係なく、同じ配置が必要です。構造体タイプへのポインターは同じ構造タイプへの他のポインタと互換性があります。

したがって、(ポインタが指す構造体ではなく)ポインタ自体を保持するためのスペースを割り当てる、パラメータとして渡す、または他のポインタにコピーする以外は、構造体へのポインタに対して何もする必要のないコードはありません。一意の名前以外に、それらが指す構造タイプについて何かを知る必要があります。構造体へのポインタではなく、構造体にスペースを割り当てる必要があるコード、またはそのメンバーのいずれかにアクセスする必要があるコードは、その型について詳しく知る必要がありますが、それらを行わないコードはそのような情報を必要としません。

于 2013-03-20T14:57:48.090 に答える