I'm trying to implement a stack in C. I have only implemented the struct that will contain an array and that currently only contains the size of the array and the position of the last item added to the stack
This is a partial implementation that is giving me some trouble.
in stack.h
#include <stdlib.h>
#include <stdbool.h>
typedef struct Stack
{
int max_size;
int top;
// int *contents;
} Stack;
Stack *stack_create(int n);
bool stack_is_empty(Stack *stack);
bool stack_is_full(Stack *stack);
void stack_push(Stack *stack, int value);
in stack.c:
#include <stdio.h>
#ifndef STACK_H
#include "stack.h"
#endif
Stack *stack_create(int n)
{
Stack stack;
Stack *s = &stack;
s->max_size = n;
s->top = 0;
// s->contents = (int *)malloc(sizeof(int) * n);
return s;
}
bool stack_is_empty(Stack *stack)
{
if (stack->top == 0)
{
return true;
}
return false;
}
bool stack_is_full(Stack *stack)
{
if (stack->top == stack->max_size)
{
return true;
}
return false;
}
void stack_push(Stack *stack, int value)
{
if (!stack_is_full(stack))
{
printf("max_size: %d\n", stack->max_size);
printf("top: %d (%p)\n", stack->top++, &stack->top);
printf("value: %d (%p)\n", value, &value);
}
else
{
printf("Can't push. max_size==%d reached.\n", stack- >max_size);
exit(EXIT_FAILURE);
}
}
and in main.c:
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
#define SIZE 3
int main()
{
Stack *s = stack_create(SIZE);
printf("stack_is_empty: %d\n", stack_is_empty(s));
stack_push(s, 100);
printf("stack_is_empty: %d\n", stack_is_empty(s));
stack_push(s, 30);
printf("stack_is_empty: %d\n", stack_is_empty(s));
stack_push(s, 20);
printf("stack_is_empty: %d\n", stack_is_empty(s));
return 0;
}
main produces the following output:
stack_is_empty: 1
max_size: 3
top: 100 (0x7ffd5430dfb4)
value: 101 (0x7ffd5430dfb4)
stack_is_empty: 0
max_size: 3
top: 30 (0x7ffd5430dfb4)
value: 31 (0x7ffd5430dfb4)
stack_is_empty: 0
max_size: 3
top: 20 (0x7ffd5430dfb4)
value: 21 (0x7ffd5430dfb4)
stack_is_empty: 0
Why is value's address the same of stack->top?
malloc(andfree). The pointer thatstack_createis a pointer to a local variable, whose life-time ends when the function returns.stack_pushyou do a lot of nice printing, but you don't actually put the value in the stack:stack->content[stack->top++]= value;