我得到一个段错误,同时运行此代码以在C中实现堆栈。请注意,代码有点不完整。我只是想检查一下,看看是否可以将一些元素推到堆栈上并打印出来。但它抛出了一个段错误。任何帮助将不胜感激!!
#include<stdlib.h>
#include<stdio.h>
struct stack
{
int *elems;
int ll;
int al;
};
void stack_new(struct stack *s)
{
s->ll=0;
s->al=4;
s->elems=malloc(4*sizeof(int));
}
void stack_del(struct stack *s)
{
free(s->elems);
}
void stack_push(struct stack *s,int value)
{
if(s->ll==s->al)
{
printf("overflow");
/*s->al*=2;
s->elems=realloc(s->elems, s->al*sizeof(int));*/
}
s->elems[s->ll]=value;
s->ll++;
}
void stack_pop(struct stack *s)
{
s->ll--;
return (s->elems[s->ll]);
}
void main()
{
struct stack *s;
stack_new(s);
stack_push(s,3);
stack_push(s,4);
stack_push(s,8);
printf("%d", s->elems[0]);
//stack_pop(s);
//stack_del(s);
}
答案 0 :(得分:2)
声明
struct stack *s;
不会为struct stack
分配任何内存。那样做:
struct stack *s = malloc(sizeof *s);
或者只是将你的堆栈放在堆栈上:
struct stack s;
stack_new(&s);
…
使用更具描述性的字段名称也是一个好主意。
答案 1 :(得分:0)
您有几个错误
您永远不会在s
函数中初始化指针main
,因此在stack_new
函数解除引用s
会导致细分错误。
您应该首先为堆栈分配空间,无论您想要什么,但您必须。
另一件事是,如果您要使用常数初始化al
字段,然后分配一个常量大小的数组,则不需要字段al
,并且您可以将elems
声明为int elems[CONSTANT_NUMBER]
,但如果您希望它是动态的,我认为您希望通过if(s->ll == s->al)
函数中的stack_push
检查,那么您可以只需将al
所需的值传递给stack_new
函数。
这是你的一些代码,已修复,所以你可以看到我的意思。
#include<stdlib.h>
#include<stdio.h>
struct stack
{
int *elems;
int ll;
int al;
};
struct stack *stack_new(int al) /* you can pass the maximum number of elements allowed */
{
struct stack *s;
s = malloc(sizeof(struct stack));
if (s == NULL)
return NULL;
s->ll = 0;
s->al = al;
s->elems = malloc(al * sizeof(int)); /* and you dynamically allocate space for them here */
return s;
}
void stack_del(struct stack *s)
{
if (s != NULL) /* always check the pointers to prevent `SEGMENTATION FAULT` */
{
if (s->elems != NULL)
free(s->elems);
free(s);
}
}
void stack_push(struct stack *s, int value)
{
if (s == NULL)
return;
if(s->ll == s->al)
{
printf("overflow");
/*s->al*=2;
s->elems=realloc(s->elems, s->al*sizeof(int));*/
}
if (s->elems != NULL)
s->elems[s->ll] = value;
s->ll++;
}
int stack_pop(struct stack *s)
{
if ((s == NULL) || (s->elems == NULL))
return 0;
s->ll--;
return (s->elems[s->ll]);
}
int main()
{
struct stack *s;
s = stack_new(4);
stack_push(s, 3);
stack_push(s, 4);
stack_push(s, 8);
printf("%d", s->elems[0]);
stack_pop(s);
stack_del(s);
return 0;
}
```