c - 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);
}
解决方案
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));
推荐阅读
- php - 如何防止在没有 url 的情况下访问 PHP 中的页面?
- python-3.x - Python:如何迭代并将一定数量的元素放入列表中并将这些列表放入列表中?
- c - #在c中定义数组格式
- ruby - 如何在 watir 中处理下载首选项和插入首选项?我想知道可供他们使用的选项列表
- mysql - 拆分 SQL 语句
- walmart-api - 沃尔玛分页产品 API
- python - 将 /all/ 参数从 python 传递到 bash 脚本
- docker - 找不到适用于 windows 版本 14393 的好的 docker 映像
- jquery - 从 AJAX url 中删除可选参数
- javascript - 网络工作者在其代码完成后会自行关闭吗?