在C中实现堆栈时的Segfault

时间:2014-12-16 00:22:26

标签: c struct segmentation-fault stack

我得到一个段错误,同时运行此代码以在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);
}

2 个答案:

答案 0 :(得分:2)

声明

struct stack *s;

不会为struct stack分配任何内存。那样做:

struct stack *s = malloc(sizeof *s);

或者只是将你的堆栈放在堆栈上:

struct stack s;

stack_new(&s);
…

使用更具描述性的字段名称也是一个好主意。

答案 1 :(得分:0)

您有几个错误

  1. 您永远不会在s函数中初始化指针main,因此在stack_new函数解除引用s会导致细分错误。

  2. 您应该首先为堆栈分配空间,无论您想要什么,但您必须。

  3. 另一件事是,如果您要使用常数初始化al字段,然后分配一个常量大小的数组,则不需要字段al,并且您可以将elems声明为int elems[CONSTANT_NUMBER],但如果您希望它是动态的,我认为您希望通过if(s->ll == s->al)函数中的stack_push检查,那么您可以只需将al所需的值传递给stack_new函数。

  4. 这是你的一些代码,已修复,所以你可以看到我的意思。

    #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;
    }
    

    ```