0

これは、バイナリ ツリーの問題というよりはポインタの問題だと思います。演習として、二分木を使用して C で推測/学習ゲームを再作成していました。ツリーを調べて質問するトラバースというメソッドがありました。このメソッドは、存在しないノードが見つかったときに、ユーザーにノードを作成するための入力を求めるため、学習部分です。ただし、これを行うと、データが破損します。これは、関連するコードを再作成したものです。

Node * getnew(char *msg, char isAns)
{
    Node *nnew = malloc(sizeof(Node));
    nnew->ID=clock();
    nnew->guess=msg;
    nnew->isAns=isAns;
    nnew->yes=0;
    nnew->no=0;
    return nnew;
}
void traverse(Node **top)
{
    char ques[128] = "ok";
    char ans[128] = "ok";
    printf("Node is null\n");
    printf("Put in a question and answer to yes condition\n");
    printf("Enter question: ");
    while(!fgets(ques,128,stdin));
    printf("Enter answer for yes condition: ");
    while(!fgets(ans,128,stdin));
    printf("Check ques: %s\nCheck ans: %s\n\n",ques,ans);
    make_question_answer(top,ques,ans);
    fprintf(stdout,"\ncheck in method: top: %s\n\n",(*top)->guess);
    fprintf(stdout,"\ncheck in method: top->yes: %s\n\n",(*top)->yes->guess);
}
void make_question_answer(Node **change, char *ques,char *ans)
{
    Node *top = getnew(ques,'n');
    Node *a = getnew(ans,'y');
    top->yes=a;
    top->no=(*change);
    *change=top;
}
int main()
{
    Node *top=0;
    traverse(&top);
    fprintf(stdout,"\ncheck: %s\n\n",top->yes->guess);
}

メインで make_question_answer() を使用すると、トップが正常に変更され、トラバースで機能しますが、メインに戻るジャンプでは持続しません。fprintfで見られるように、破損したデータを指しています。なぜこれが起こっているのか分かりません。

4

2 に答える 2

2

実際に起こっていることは、文字列をコピーするのではなく、ローカル文字配列へのポインターを格納していることだと思います。getnew関数で、次のように文字列をコピーします。

nnew->guess = strdup(msg);
于 2013-05-02T22:25:36.110 に答える
1

getnew() では、 nnew->guess をスタック変数に割り当てています。文字列にメモリを割り当て、strncpy() またはその他のメカニズムを使用して、新しく割り当てられたメモリを埋めることを検討してください。

于 2013-05-02T22:24:38.853 に答える