【问题标题】:Segfault while Implementing stack in C在 C 中实现堆栈时出现段错误
【发布时间】:2015-02-14 05:30:25
【问题描述】:

在运行此代码以在 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);
}

【问题讨论】:

    标签: c struct segmentation-fault stack


    【解决方案1】:

    声明

    struct stack *s;
    

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

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

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

    struct stack s;
    
    stack_new(&s);
    …
    

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

    【讨论】:

      【解决方案2】:

      你有几个错误

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

      2. 您应该首先为堆栈分配空间,无论您想在哪里但必须这样做。

      3. 另外,如果你想用一个常数初始化你的al字段,然后分配一个常数大小的数组,你不需要字段al,你可以声明elems作为int elems[CONSTANT_NUMBER] 但如果你希望它是动态的,这就是我认为你在stack_push 函数中检查if(s-&gt;ll == s-&gt;al) 想要的,那么你可以简单地将你想要al 的值传递给@ 987654332@函数。

      这是您的一些代码,已修复,因此您可以了解我的实际意思。

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

      ```

      【讨论】:

        猜你喜欢
        • 2021-01-17
        • 2021-12-03
        • 2021-08-05
        • 2019-09-30
        • 1970-01-01
        • 1970-01-01
        • 2018-10-10
        • 2013-10-05
        • 2013-04-16
        相关资源
        最近更新 更多