Noober
Noober

Reputation: 1626

Error in implementing stack in c

I am trying to implement stack in c. Here is what I have done-

#include <stdio.h>
#include <stdlib.h>

typedef struct stack 
{
    char * data;
    struct stack * next;
}stack;
stack * top1;

void push(char* data,stack * top)
{
    stack* temp;
    temp = (stack*)malloc(sizeof(stack));
    if (!temp)
        return;
    temp->data = data;
    temp->next = top;
    top = temp;
}

int isEmpty(stack * top)
{
    if(top == NULL)
        return 1;
    return 0;
}

char* pop(stack * top)
{
    stack* temp; char*data;
    if (isEmpty(top) == 1)
        return "FALSE";
    temp = top;
    data = top->data;
    top = top->next;
    free(temp);
    return data;
}

void display(stack * top)
{   stack* temp = top;
    while(temp!=NULL) {
        printf("%s \n",temp->data);
        temp = temp->next;
    }
}

 int main()
 {
    top1=(stack *)malloc (sizeof(stack));
    push("aa",top1);
    push("bb",top1);
    push("cc",top1);
    display(top1);
    char* data;
    data =pop(top1);
    printf("Pop = %s\n",data );
    data =pop(top1);
    printf("Pop = %s\n",data );
    display(top1);
 }

But I am getting the following error-

(null) 
Pop = (null)
*** Error in `./exe': double free or corruption (fasttop): 0x00000000025cc010 ***
Aborted (core dumped)

The code appears to be correct, yet it is giving the error.

Upvotes: 1

Views: 64

Answers (1)

dbush
dbush

Reputation: 224942

In push and pop, you pass in the value of top1. So when you manipulate the local variable top in both cases, it has no effect on top1.

You need to pass the the address of top1 to these functions in order to modify its contents. Also, you should initialize top1 to NULL.

void push(char* data,stack ** top)
{
    stack* temp;
    temp = malloc(sizeof(stack));   // don't cast the return value of malloc
    if (!temp)
        return;
    temp->data = data;
    temp->next = *top;
    *top = temp;
}
...
char* pop(stack ** top)
{
    stack* temp; char*data;
    if (isEmpty(*top) == 1)
        return "FALSE";
    temp = *top;
    data = (*top)->data;
    *top = (*top)->next;
    free(temp);
    return data;
}
...
 int main()
 {
    top1=NULL;
    push("aa",&top1);
    push("bb",&top1);
    push("cc",&top1);
    display(top1);
    char* data;
    data =pop(&top1);
    printf("Pop = %s\n",data );
    data =pop(&top1);
    printf("Pop = %s\n",data );
    display(top1);
 }

Upvotes: 5

Related Questions