Передайте указатель на struct и int на функцию в C для реализации стека - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь реализовать стек в C. Я реализовал только структуру, которая будет содержать массив и которая в настоящее время содержит только размер массива и позицию последнего элемента, добавленного в стек

Это частичная реализация, которая доставляет мне некоторые проблемы.

в 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);

в 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);
     }
}

и в 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 производит следующий вывод:

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

Почему адрес value совпадает с stack->top?

1 Ответ

0 голосов
/ 24 ноября 2018

Проблема 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...