0

私は持っています

struct Node{
    Node* father;
    Node* left_son;
    Node* right_son;
    char content;
};

void build_tree(Node* node){
    Node* left;
    left->father=node; //segfault
}

void init(){
    Node* root;
    build_tree(root);
}

でセグメンテーション違反が発生していbuild_tree()ます。なんで?

4

4 に答える 4

4
Node* left;

これは単にポインタを宣言するだけです。他には何もありません。Nodeオブジェクトはありません。ポインタはオブジェクトを指すことができNodeますが、自動的にオブジェクトを提供するわけではありません。現状では、left初期化されておらず、未定義の動作を呼び出さずに逆参照することはできません。

Node何らかの方法でオブジェクトを割り当てる必要があります。おそらくnew:を使用します。

Node* left = new Node();

しかし、それからあなたもそれを忘れないようにしてくださいdelete

于 2013-03-12T10:55:34.237 に答える
2

初期化しないleftので、一見ランダムな場所を指します。ランダムポインタを間接参照すると、未定義の動作が発生し、クラッシュが発生することがよくあります。

root同じことが関数にも当てはまりmainます。

ノードを使用する前に、ノードを割り当てる必要があります。

于 2013-03-12T10:54:12.853 に答える
2

関数の左側はbulid_tree()、父親を指すために使用する前に、有効な値が割り当てられていません。

何に使われているのかわかりませんbuild_tree()。しかし、この問題を解決するために、コードを次のように変更します。

void build_tree(Node* node)
{
    Node * left = (struct Node *)malloc(sizeof(struct Node));
    left->father=node;     
}
于 2013-03-12T11:00:06.770 に答える
1

セグメンテーション違反は通常、無効/不正なメモリアドレスにアクセスしようとする命令がある場合に発生します。

関数内:void build_tree(Node * node){

Node* left; 

--これにより、存在するはずのオブジェクトを指すように初期化されていないポインタが作成されます。

left->father=node; //segfault  

--ここでは、ポインタが初期化されたオブジェクトのメンバーにアクセスしようとしていますが、実際にはオブジェクトは存在しません(新しいコンストラクタステートメントは存在しません)。したがって、アクセスは無効なアクセスであり、セグメンテーション違反が発生します。

}

上記を修正するには、SOメンバーの1つ(sftrabbit)が以前に応答したため、ポインターの初期化の前に次のステートメントを追加する必要があります:: Node * left = new Node();

それで全部です。お役に立てれば

于 2013-03-13T04:29:01.607 に答える