打印C后结构成员的值发生变化

时间:2012-11-08 22:46:35

标签: c member

我在打印节点的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',第二个打印命令导致'ID 1980796117'。如何通过打印来改变这个值?可以请任何人帮助我,我真的不知道!

1 个答案:

答案 0 :(得分: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