2012-11-08 41 views
3

我在打印節點的id成員變量時得到了這段代碼和一個奇怪的行爲。打印後結構成員的值發生變化C

#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'。如何通過打印來改變這個值?可以請任何人幫助我,我真的不知道!

+0

您可以將代碼剝離到發生這種情況的最簡單情況嗎? – Isaac

回答

4
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)。

+0

好吧,我明白了!非常感謝!我必須解決這個問題。 – user1810736