В то время как я собираю и собираюсь нажать элемент, я получаю ошибку сегментации - PullRequest
0 голосов
/ 28 февраля 2019

Пока я компилирую и собираюсь добавить элемент, я получаю ошибку сегментации.Что такое ошибка сегментации? Может кто-нибудь объяснить мне о такой тип ошибки.Это связано с обработкой памяти?

#include<iostream>

#define MAX 10
using namespace std ;


typedef struct
{
int items[MAX] ;
int top=-1;

}node;


int isFull(node *s){
if (s->top==MAX-1)
{
    return 1 ;

}

else{
    return 0;
}
}


int isEmpty(node *s){
if (s->top==-1)
{
    return 1 ;

}

else{
    return 0;
}



}

void push(node *s , int );
void pop(node *s);




void push(node *s , int n ){
if (isFull(s))
{
    cout<<"Stack overflow"<<endl;


}
else{

    s->items[++(s->top)]=n;

}



}


void pop(node *s){
    if(isEmpty(s)){
        cout<<"The stack is empty";

    }
    else{
cout<<"item poppe is "<< s->items[s->top--] <<endl;
    }
}





int main(){

int num, choice ;
node *s ;
int flag ;

do{


    cout<<"Enter your choice"<<endl;

    cout<<"1.Push"<<endl;
    cout<<"2.POP"<<endl;
    cout<<"3.Exit"<<endl;

    cin>>choice;
    switch(choice){
        case 1 :
        cout<<"Enter the number to insert "<<endl;
        cin>>num;
        push(s,num );
        break ;

        case 2 :
        pop(s);
        break ;



        default:
        cout<<"Error";
        break;
    }
}
while(flag!=0);

return 0 ;


}

ОШИБКА IS:

Ошибка сегментации

                                                                                                                                    Program finished with exit code 139 

Что такое ошибка сегментации?Отличается ли это в C и C ++?Как связаны ошибки сегментации и висячие указатели?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Ошибка сегментации означает, что вы получили доступ к некоторой области памяти, которую вы не должны.

В вашем случае это потому, что указатель s не инициализирован.

В этом случае правонужно использовать не указатель для вашего стека, а использовать оператор адреса & для получения нужного указателя.

int main(){
...
node s; // not a pointer
...
        push(&s, num); // use & operator
...
        pop(&s); // use & operator

Указатели никогда не «магически» указывают на объекты, у вас естьраспределять объекты либо путем объявления переменных, либо с помощью new.

0 голосов
/ 28 февраля 2019

Вы определяете указатель на узел (фактически полный стек), но вы не создаете объект узла , на который может указывать этот указатель.Следовательно, вы разыменовываете неинициализированный указатель, который приводит к неопределенному поведению (например, segfault).

Вместо

node *s ;
...
push(s,num );

Запись

node s ;
...
push(&s,num );

Или

node *s = new node();  // or = malloc(sizeof(node)) in C
...
push(s,num );
...
// once the stack is not used any more:
delete s; // or free(s) in C.

, так что вы создаете фактический объект, адрес которого вы можете передатьто.

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