Home > Blockchain >  Creating pointer to a typedef stack
Creating pointer to a typedef stack

Time:09-26

I am not able to initialize all three pointers to struct S, and I don't know why.

I am using a fixed-length array as stack to store values. The header file is created this way to hide information (struct S), and should be kept as generic as possible.

main.c

// main.c


#include <stdio.h>
#include "stack_exercise4.h"

int main(void) {
    Stack *stack_1, *stack_2, *stack_3;
    int a, b;

    make_empty(stack_1);
    make_empty(stack_2);
    make_empty(stack_3);

    return 0;
}

Problem is, after Stack *stack_1, *stack_2, *stack_3, only stack_2 has a valid address for Struct stack. stack_1 and stack_3 have some strange looking addresses, and I can't assign any values to stack_1->top, nor stack_3->top. What is the problem?

enter image description here

header file

// stack_exercise4.h

#ifndef STACK_EXERCISE4_H
#define STACK_EXERCISE4_H

#include <stdbool.h>   /* C99 only */

typedef struct S Stack; /* incomplete type to hide the content
                           of S. */

void make_empty(Stack *s);
bool is_empty(const Stack *s);
bool is_full(const Stack *s);
void push(Stack *s, int i);
int pop(Stack *s);

#endif

stack source file

// stack_exercise4a.c

#include "stack_exercise4.h"
#include <stdio.h>

#define MAX_STACK_SIZE (10)

struct S {
    int top;
    int contents[MAX_STACK_SIZE];
};

void make_empty(Stack *s) {
    s->top = 0;
}

bool is_empty(const Stack *s) {
    return (s->top <= 0);
}

bool is_full(const Stack *s) {
    return (s->top >= MAX_STACK_SIZE - 1);
}

void push(Stack *s, int i) {
    if (!is_full(s)){
        (s->contents)[s->top  ] = i;        
    } else {
        printf("Failed to push, Stack is full.\n");
    }
}

int pop(Stack *s) {
    return (s->contents)[s->top--];
}

CodePudding user response:

The stack pointers must point on memory spaces before being dereferenced in make_empty(). Something like this could be the starting point: make_empty() allocates the memory space.

void make_empty(Stack **s) {
  (*s) = (struct S *)malloc(sizeof(struct S));
  (*s)->top = 0;
}

And so the initialization of the pointers would be:

    make_empty(&stack_1);
    make_empty(&stack_2);
    make_empty(&stack_3);

CodePudding user response:

Declare stack_X on stack instead.

#include <stdio.h>
#include "stack_exercise4.h"

int main(void) {
    Stack stack_1 = {0}, stack_2 = {0}, stack_3 = {0};
    int a, b;

    make_empty(&stack_1);
    make_empty(&stack_2);
    make_empty(&stack_3);

    return 0;
}

Otherwise, I't would need to have constructor/destructor for your Stack data structure e.g new_stack(Stack *ptr) del_stack(Stack *ptr). For beginner, I would recommend to use stack instead of heap (stay away from malloc).

  •  Tags:  
  • c
  • Related