首页 > 解决方案 > c 中的已退出分段错误

问题描述

我试图将两个堆栈合并为一个,但它的显示分段错误。我调试了代码并在第 41 行发现了错误。

sp[2].arr[val] = sp[i].arr[j];

继承人的代码:

#include <stdlib.h>

struct stack{
  int size;
  int top;
  int *arr;
};

void push(struct stack *sp, int k)
{
  int val;
  for(int i=0;i<sp[k].size;i++)
  {
    if(sp[k].top == sp[k].size)
    {
      printf("Stack overflow\n");
    }
    else
    {
      sp[k].top++;
      scanf("%d", &val);
      sp[k].arr[sp[k].top] = val;
    }
    
  }
}

void merge(struct stack *sp)
{
  int j=0,k=0;
  //sp[2].size = sp[0].size + sp[1].size;
  int val = 0;
  
  for(int i=0;i<2;i++)
  {
    //k=k+sp[i].size;
    for(j=0;j<sp[i].size;j++)
    {
      sp[2].arr[val] = sp[i].arr[j];
      val++;
    }
  }
}

void display(struct stack *sp)
{
  for(int i=0;i<2;i++)
  {
    for(int j=0;j<sp[i].size;j++)
    {
      printf("%d", sp[i].arr[j]);
    }
  }
}

int main(){
  struct stack *sp = (struct stack *) malloc(3*sizeof(sp));

  printf("Enter the size of first stack:\n");
  scanf("%d", &sp[0].size);

  printf("Enter the size of second stack:\n");
  scanf("%d", &sp[1].size);

  sp[2].size = sp[0].size + sp[1].size;

  sp[0].arr = (int *) malloc(sp[0].size*sizeof(int));
  sp[1].arr = (int *) malloc(sp[1].size*sizeof(int));
  sp[2].arr = (int *) malloc(sp[2].size*sizeof(int));

  sp[0].top = -1;
  sp[1].top = -1;
  sp[2].top = -1;
  
  for(int i =0;i<2;i++)
  {
    printf("Enter the element of %d stack:\n", i+1);
    push(sp,i);
  }

  merge(sp);

  display(sp);
  
}

标签: c

解决方案


  struct stack *sp = (struct stack *) malloc(3*sizeof(sp));

是错的。sizeof(sp)是指针的大小。取而代之的是,您必须为结构分配。

另请注意,铸造结果malloc()认为是一种不好的做法

它应该是

  struct stack *sp = malloc(3*sizeof(*sp));

或者

  struct stack *sp = malloc(3*sizeof(struct stack));

推荐阅读