首页 > 解决方案 > Pass a pointer to struct and a int to a function in C to implement a stack

问题描述

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?

标签: cpointersstruct

解决方案


问题 1:您在 stack_create 函数中为堆栈本地分配内存。一旦函数超出范围内存将被释放。因此,您将有一个悬空指针。

问题 2:您只为一个实例分配内存,而不管 'n' 的值如何

typedef struct Stack
{
    int max_size;
    int *contents;
    int top;
    // int *contents;
} Stack;

Stack *stack_create(int n) {
    Stack *s;
    s = (Stack *)malloc(sizeof(Stack));
    s->contents = (int *)malloc(sizeof(int) * n);
    s->max_size = n;
    s->top = 0;
    return s;
}

推荐阅读