递归 段错误 习题
Posted xuwanwei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归 段错误 习题相关的知识,希望对你有一定的参考价值。
段错误
- 递归里面算阶乘 f(10000000)没有输出,使用gdb 显示 SIGSEGV--段错误
- 编译后产生的可执行文件里面保存着什么?
- UNIX/Linux 用 ELF
- DOS下用COFF
- Windows用PE(COFF扩充而得)
- 段(segmentation)
- 二进制文件内的区域。
- 可用size程序得到可执行文件中的各个段的大小
- Text Segment--正文段--储存指令
- Data Segment--数据段--储存已初始化的变量
- BSS Segment--BSS段--未赋值的全局变量
- 栈
- 栈不储存在可执行文件内,而是在运行时创建
- 调用栈所在的段成为Stack Segment
- 和其他段一样,不能越界访问,否则会stack overflow
- 调用栈保存函数的调用关系和局部变量
- 栈空间的大小
- linux 通过ulimit修改 ulimit -a显示当前栈的大小, ulimit -s 32768 把栈大小指定为32MB
- windows 用gcc指定执行文件的栈大小,-Wl,--stack=<byte count>
- 局部变量也是放在堆栈段中,栈溢出不一定是因为递归调用太多次,可能是局部变量太大。因此建议“把较大的数组放在main函数外。
竞赛题目
- 刽子手游戏
- 看输入字符和给定字符关系
- 使用全局变量可便于维护内容,可以免去过多的参数传递。
- 猜过的字母再猜一次算错:将猜过的字母从答案内“删去”(改成不可能满足为答案的条件的数据)
- 救济金发放
- 一圈官员,两个官员逆时,顺时针数k, m个数,停下,被选中的离开队伍(可能是同一个人)
-
#include<stdio.h> #define maxn 25 int n,k,m,a[maxn]; //逆时针走t步,步长为d 返回新位置 int go(int p,int d,int t) { while(t--) { do { //前面减去1??? p=(p+d+n-1)%n+1; //注意这里经过的数字是步数加一! 因此会有最后的+1; } while(a[p]==0); } return p; } int main() { while(scanf("%d%d%d",&n,&k,&m)) { for(int i=1;i<=n;i++) a[i]=i; int left=n; int p1=n,p2=1; while(left) { p1=go(p1,1,k); p2=go(p2,-1,m); printf("%3d",p1);left--; if(p2!=p1) { printf("%3d",p2); left--; } a[p1]=a[p2]=0; if(left) printf(","); } printf("\n"); } return 0; }
- 信息解码
- 01字符串,长度会逐渐增加,且不存在全1的串。 编写一个解码程序,输入一个编码头,则序列的每个串对应一个字符。再编码文本。每个小结前三个数字表示编码长度,每小节以全1结束,编码以000结束。
以上是关于递归 段错误 习题的主要内容,如果未能解决你的问题,请参考以下文章