Reputation: 1626
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
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