1

そのため、構造体の typedef を含むヘッダー ファイルが提供されました。

ソースファイルで上記の構造体を定義する必要があり、ヘッダーを変更できません

これにより、作成したこれらの構造体にどのような制限が課せられますか?

私のヘッダーファイルには

typedef struct tldnode TLDNode;

私のソースファイルには

struct tldnode
{
    int count;
    char *tld;
    TLDNode *left;
    TLDNode *right;
};

プログラムを実行しているときにセグメンテーション違反が発生し、GDB を使用して、障害の時点で、メモリの場所にアクセスできないため、TLDNode メンバーの値を出力できないことを発見しました

これは、冒頭で述べたように、構造体の定義方法に関連していますか、それとも別の可能性がありますか?

奇妙なメモ、TLDNode ポインターのメモリ位置は最初のメンバー (int カウント) と同じ位置です。これは、メモリ割り当てでどこかを台無しにしたことを意味していると確信していますが、よくわかりません

4

1 に答える 1

2

ポイントさstruct tldnodeれたのメモリ位置は、tldnode の最初のメンバーのメモリ位置と同じです。

これは、構造 member のメモリ レイアウトによるものです。各メンバは、それらすべてを格納するのに十分な大きさのメモリ ブロック内で他のメンバの隣に割り当てられます。メモリ ブロックのサイズは、構造体のサイズです。

例を使用すると、より明確になる可能性があります。

struct X {
 int a;
 int b;
};

struct X x;

printf("%p\n", &x);    // some address
printf("%p\n", &x.a);  // same address
printf("%p\n", &x.b);  // same address + 4 (provided that int are stored on 4 bytes)

エラーはおそらく別の場所にあります。

3 番目のソース ファイルから、TLDNode 型のポインターの内容にアクセスしたいようです。つまり、typedef struct tldnode TLDNode の背後に何が隠されているのかわかりません。そして、それはおそらくより良いものです。

(TLDNode *) 内から tld ポインターにアクセスする場合は、構造体の内部知識を使用して取得する getter 関数を追加する必要があります。

ヘッダーに、次のようなものを追加します

char * getTld(TLDNode * node);

持っているソース ファイルに、この関数の定義を追加します。

char * getTld(TLDNode * node)
{
    return node->tld; // NULL check maybe...
}

3 番目のソース ファイルではnode->tldgetTld(node).

于 2013-10-17T20:48:20.567 に答える