C中的堆栈实现

时间:2010-09-09 03:09:10

标签: c stack

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);
}

给我一​​个执行错误。

这个功能有什么问题?

4 个答案:

答案 0 :(得分:12)

这是初学者的经典错误。

让我们来看看你的主要功能:

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

    create_empty_stack(Stack);
}

如果你记得指针,声明Pilha* Stack;使 Stack 成为一个内存指针。但是现在它并没有指向任何东西,因为你没有为Pilha类型的物体保留记忆!

你的程序崩溃是因为create_empty_stack()试图访问 next ,这个对象的成员(请记住这个对象仍然不存在)。

所以,你应该做的是:

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); 
}

答案 1 :(得分:3)

你最好像这样创建你的功能:

Pilha* create_empty_stack()
{

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

答案 2 :(得分:2)

您正在将未初始化的变量Stack传递给函数Criar_Pilha_vazia。一旦您在函数中对Stack进行第一次取消引用,它就会崩溃。

答案 3 :(得分:1)

考虑 Criar_Pilha_vazia()行中Stack指向的内容。分配的取消引用指向随机位置。在虚拟内存环境中,它会发生段错误。