3

ノードのidメンバー変数を出力しているときに、このコードと奇妙な動作が発生しました。

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

struct node
{
    int id;
    int visited;
//    struct node *neighbors_[];
};

struct graph
{
    struct node nodes[26];
    int adjMat[26][26];

};

struct stack_item
{
    struct node node;
    struct stack_item *next_;
};

struct myStack
{
    struct stack_item *anfang_;

};

void initGraph(struct graph *graph_);
void push(struct myStack *stack_, struct node node);

int main()
{

    struct graph graph;
    struct myStack stack;
    char ausgabe[26]="";

    initGraph(&graph);


    //READ DATA
    char line[200];
    int firstTime=1,first;

    first=0;
    push(&stack,graph.nodes[first]);

    printf("ID %i\n",stack.anfang_->node.id);
    printf("ID %i\n",stack.anfang_->node.id);

    //FINISHED DATA READING
     //CALL DFS
    //dfs(graph,stack,ausgabe);
}

void push(struct myStack *stack_, struct node node)
{
    struct stack_item item;
    item.node=node;
    item.next_=stack_->anfang_;

    stack_->anfang_=&item;
}

void initGraph(struct graph *graph_)
{
    int i,j;
    for(i=0; i<26; i++)
    {
        struct node node= {i,0};
        graph_->nodes[i]=node;

        for(j=0; j<26; j++)
        {

            graph_->adjMat[i][j]=0;

        }
    }
}

これを実行すると、最初の印刷コマンドは「ID 0」になり、2番目は「ID1980796117」になります。この値を印刷することでどのように変更できますか?誰か助けてくれませんか、本当にわかりません!

4

1 に答える 1

5
void push(struct myStack *stack_, struct node node)
{
    struct stack_item item;
    item.node=node;
    item.next_=stack_->anfang_;

    /* BAD! */
    stack_->anfang_=&item;
}

itemはローカル変数であり、push関数が戻るとスコープ外になります。このオブジェクトを参照する既存のポインターはすべて無効になり、逆参照すると未定義の動作になります。

関数が戻った後も永続化する必要がある場合は、動的に割り当てるitem(つまり)必要があります。malloc

于 2012-11-08T22:58:33.710 に答える