2010-09-09 178 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; 
}