利用栈的存储原理,完成数制转换程序【C语言】
program received signal sigsegv,Segmentation fault的出现
引言
记录一下数据结构学习过程中遇到的问题。
学习内容
掌握栈的两种存储结构的定义及C语言实现,掌握顺序栈和链栈的各种基本操作(栈的初始化、入栈、出栈等)。
掌握递归的实现方法。
点击运行没有出现预期结果,调试过程中出现了 program received signal sigsegv,Segmentation fault报错。如下图
SIGSEGV是指当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。
意思是程序接受一个无效的指针地址,Segmentation fault即是提示我们去注意定义指针的符号
一般出现这种错误,主要原因是指针和数组的原因:
- 定义变量类型与输出不一致的时候
- scanf中没有写&的时候
- 当你用到空指针的时候
- 内存越界或者数组越界的时候等等
未修改前代码
void conversion(int N) //10进制转换成2进制
{
struct stack *s;
initstack(s);
int yuShu;
while (N){
yuShu = N % 2;
N /= 2;
push(s,yuShu);
}
while (!StackEmpty(s)){
pop(s);
}
}
修改后的
void conversion(int N) //10进制转换成2进制
{
struct stack s;
initstack(&s);
int yuShu;
while (N){
yuShu = N % 2;
N /= 2;
push(&s,yuShu);
}
while (!StackEmpty(&s)){
pop(&s);
}
}
完整代码
运用(顺序)栈的初始化、入栈、出栈等,完成十进制转换为二进制
#include"stdio.h"
#include"stdlib.h"
struct stack{
int *base;
int *top;
int stacksize;
};
void initstack(struct stack *s) //初始化
{
s->base=(int*)malloc(20*sizeof(int));
if(!s)
{
exit(0);
}
s->top=s->base;
s->stacksize=20;
return;
}
void push(struct stack*s,int e ) //入栈
{
if(s->top-s->base>=s->stacksize)
{ s->base=(int*)realloc(s->base,(s->stacksize+n)*sizeof(int));
if(!s->base) exit(0);
s->top=s->base+s->stacksize;
s->stacksize+=n;
}
*(s->top)++=e;
return;
}
void pop(struct stack *s) //出栈
{
int e;
if(s->top==s->base) return ;
e=*--s->top; printf("%d",e);
return ;
}
int StackEmpty(struct stack *s) //判空
{
if(s->top==s->base) return 1;
else return 0;
}
void conversion(int N) //10进制转换成2进制
{
struct stack s;
initstack(&s);
int yuShu;
while (N){
yuShu = N % 2;
N /= 2;
push(&s,yuShu);
}
while (!StackEmpty(&s)){
pop(&s);
}
}
int main()
{ int x;
printf("\n请输入一个十进制数据:");
scanf("%d",&x);
printf("\n 转换成二进制为: ");
conversion(x);
printf("\n");
}
运行示例
如有不当,欢迎批评指正。