2017-12-26 50 views
1

構造体に問題があります。自分自身へのポインタを持つ構造体を使用する必要があります。私はこれを行っていると私はそれがうまくいくと思う:C構造体へのポインタを持つ構造体 - 値にアクセスする

typedef struct tag_t tag_t; 
    struct tag_t{ 
    char name[15]; 
    int is_self_closing; 
    tag_t *child; 
}; 

は、私は私のプログラムのコアがダンプと、HTMLタグの子である「身体」のように、タグに子を追加する機能を作っています子ポインタの "name"と "is_self_closing"変数を使って作業しようとすると、セグメンテーションエラーが発生しました。私はそれらに正しくアクセスする方法を知らない。これはプログラムのコード全体です。あなたのadd_chilld()関数の内部

#include <stdio.h> 
#include <string.h> 

typedef struct tag_t tag_t; 
struct tag_t{ 
    char name[15]; 
    int is_self_closing; 
    tag_t *child; 
}; 

void add_chilld(tag_t *,char[15],int); 

void print_markup(tag_t); 

int main(int argc, char **argv){ 
    tag_t parent,child; 
    strcpy(child.name,"body"); 
    child.is_self_closing = 1; 
    strcpy(parent.name,"html"); 
    parent.is_self_closing = 0; 
    add_chilld(&parent,child.name,child.is_self_closing); 
    printf("child name = %s child closing = %d\n",child.name,child.is_self_closing); 
    printf("%s %d %s\n",parent.name,parent.is_self_closing,parent.child->name); 
    return 0; 
} 

void add_chilld(tag_t *parent,char name[15],int is_self_closing){ 
    if(is_self_closing == 1){ 
     printf("parent name = %s\n",parent->child->name); 
     strcpy(parent->child->name,name); 
     parent->child->is_self_closing = is_self_closing; 
    }else{ 
     parent->child = NULL; 
    } 
} 
+1

ようこそスタックオーバーフロー!これまでのところあなたの研究/デバッグ作業をうまく示してください。まず[Ask]ページをお読みください。 –

+0

a)子の名前として何かを割り当てる前に、その子の名前を印刷しています。 b)子ポインタがどこにも指していない。 c) 'char name [15]'はあなたが思っていることをしません。 –

答えて

0

、あなたはparent->childにアクセスしようとしているが、あなたはそれが有効なものを指して作ったことがありません。

だから、あなたはあなたが必要とする、あなたがparent->child->nameのようなものを利用することができます前に、換言すれば、undefined behavior

の原因となる不定値、すなわち、無効なメモリアドレスを、保持している初期化されていないポインタを、逆参照していますparent変数のchildメンバーが実際には(これまで割り当てられていた)に設定されていることを確認してください。

+1

DVの理由、誰ですか? –

関連する問題