2010-09-09 135 views
2
typedef struct pilha Pilha; 

struct pilha 
{ 
    char metodo[31]; 
    Pilha *next; 
}; 

void create_empty_stack(Pilha *Stack) 
{ 
    Stack->next = NULL; 
} 

int main() 
{ 
    Pilha *Stack; 

    create_empty_stack(Stack); 
} 

給我一個執行錯誤。C中的堆棧實現

這個功能有什麼問題?

+1

聞起來像功課。 – 2010-09-09 03:10:27

+0

這是一個堆棧還是一個列表? – dreamlax 2010-09-09 03:30:38

+0

@dreamlax:它是一個實現爲單鏈表的堆棧。 – JeremyP 2010-09-09 10:52:12

回答

1

想象一下Stack指向Criar_Pilha_vazia()。賦值點的取消引用指向隨機地點。在虛擬內存環境中,它會出現段錯誤。

2

您正將一個未初始化的變量Stack傳遞給函數Criar_Pilha_vazia。只要您在函數中對Stack進行了第一次取消引用,它就會崩潰。

+0

要公平,行爲是不確定的。局部變量未初始化或歸零,理論上你可以得到一個有效的指針。 – luke 2010-09-09 03:15:24

+0

@盧克第一次聽說反墨菲..是東西,甚至有一個遙遠的機會去正確..它可能會! – vrdhn 2010-09-09 03:50:43

+2

如有疑問,請假定它格式化您的硬盤驅動器。 – 2010-09-09 03:59:18

12

這是初學者所犯的經典錯誤。

讓我們來看看你的主要功能:

int main() 
{ 
    Pilha* Stack; // This line is your problem! 

    create_empty_stack(Stack); 
} 

如果你還記得的指針,聲明Pilha* Stack;使得堆棧是內存指針。但是現在它並沒有指向任何東西,因爲你沒有爲Pilha類型的對象預留內存!

你的程序崩潰是因爲create_empty_stack()試圖訪問下一個,該對象的成員(請記住,該對象仍然不存在)。

所以,你應該做的卻是:

int main() 
{ 
    // Reserve space in memory for one Pilha object and 
    // make Stack point to this memory address. 
    Pilha* Stack = (Pilha*) malloc(sizeof(Pilha)); 

    create_empty_stack(Stack); 
} 

還是一個更簡單的方法:

int main() 
{ 
    Pilha Stack; // Declare a new Pilha object 

    // and pass the memory address of this new object to create_empty_stack() 
    create_empty_stack(&Stack); 
} 
3

你最好創建功能是這樣的:

Pilha* create_empty_stack() 
{ 

    Pilha *Stack = malloc(sizeof(Pilha)) 
    Stack->next = NULL; 
    return Stack; 
}