Реализация стека в C - PullRequest
       1

Реализация стека в C

2 голосов
/ 09 сентября 2010
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 ]

12 голосов
/ 09 сентября 2010

Это классическая ошибка, которую делают новички.

Давайте посмотрим на вашу основную функцию:

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); 
}
3 голосов
/ 09 сентября 2010

вам лучше создать свою функцию так:

Pilha* create_empty_stack()
{

    Pilha *Stack = malloc(sizeof(Pilha))
    Stack->next = NULL;
    return Stack;
}
2 голосов
/ 09 сентября 2010

Вы передаете неинициализированную переменную Stack в функцию Criar_Pilha_vazia. Он вылетит, как только вы выполните первую разыменовку на Stack в своей функции.

1 голос
/ 09 сентября 2010

Посмотрите, на что Stack указывает строка в Criar_Pilha_vazia () .Разыменование для присвоения указывает на случайное место.В среде виртуальной памяти это будет ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...