打印C后结构成员的值发生更改

打印C后结构成员的值发生更改,c,member,C,Member,我在打印node的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]

我在打印node的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;

        }
    }
}
#包括
#包括
#包括
结构节点
{
int-id;
国际访问;
//结构节点*邻居_[];
};
结构图
{
结构节点节点[26];
int adjMat[26][26];
};
结构堆栈\u项
{
结构节点;
结构堆栈\u项*下一个\u;
};
结构myStack
{
结构堆栈项目*安防项目;
};
void initGraph(结构图*图);
void push(struct myStack*堆栈,struct node);
int main()
{
结构图;
结构myStack堆栈;
char ausgabe[26]=“”;
initGraph(&graph);
//读取数据
字符行[200];
int firstTime=1,first;
第一个=0;
推送(&堆栈,graph.nodes[第一]);
printf(“ID%i\n”,stack.anfang->node.ID);
printf(“ID%i\n”,stack.anfang->node.ID);
//已完成的数据读取
//呼叫DFS
//dfs(图形、堆栈、ausgabe);
}
无效推送(结构myStack*堆栈,结构节点)
{
结构堆栈\项;
item.node=节点;
项目。下一步=堆叠->安防;
堆栈->安防->项目;
}
void initGraph(结构图*图)
{
int i,j;
对于(i=0;索引节点[i]=节点;
对于(j=0;jadjMat[i][j]=0;
}
}
}
如果我执行此命令,第一个print命令将导致“ID 0”,第二个命令将导致“ID 1980796117”。通过打印该值如何更改?请任何人帮助我,我真的不知道

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
函数返回时,该变量超出范围。引用此对象的任何现有指针现在都无效,取消引用它会导致未定义的行为


如果您需要在函数返回后将
(即
malloc
)持久化,则需要动态分配该项。

您能否将代码精简到最简单的情况?