c - 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
?
解决方案
问题 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;
}
推荐阅读
- json - 解析 `NaN` Json.parse 配置
- unit-testing - 如果一个方法调用另一个方法,是单元测试还是集成测试?
- github - 致命:解析“conf/gitolite.conf-compiled.pm”失败:没有这样的文件或目录
- netlogo - 西北扩展和代理导航
- python-3.x - 如果数据框中存在列 x1,如何给出标志 2,如果数据框中存在列 x2,如何给出标志 2.5
- android - HeaderScrollingViewBehavior 导致崩溃的原因是什么?
- salesforce - Salesforce 使用 url hacking 创建具有记录类型选择的视图
- android - Admob 广告未在 Android 上显示,但在 iOS 上有效——Flutter
- r - 如何绘制具有不同分类变量的大量密度图
- ios - 如何在滚动视图上添加多个视图控制器而不重叠