递归 段错误 习题

段错误

  1. 递归里面算阶乘 f(10000000)没有输出,使用gdb 显示 SIGSEGV--段错误
  2. 编译后产生的可执行文件里面保存着什么?
    1. UNIX/Linux 用 ELF
    2. DOS下用COFF
    3. Windows用PE(COFF扩充而得)
  3. 段(segmentation)
    1. 二进制文件内的区域。
    2. 可用size程序得到可执行文件中的各个段的大小
    3. Text Segment--正文段--储存指令
    4. Data Segment--数据段--储存已初始化的变量
    5. BSS Segment--BSS段--未赋值的全局变量
    1. 栈不储存在可执行文件内,而是在运行时创建
    2. 调用栈所在的段成为Stack Segment
    3. 和其他段一样,不能越界访问,否则会stack overflow
    4. 调用栈保存函数的调用关系和局部变量
    5. 栈空间的大小
      1. linux 通过ulimit修改 ulimit -a显示当前栈的大小, ulimit -s 32768 把栈大小指定为32MB
      2. windows 用gcc指定执行文件的栈大小,-Wl,--stack=<byte count>
    6. 局部变量也是放在堆栈段中,栈溢出不一定是因为递归调用太多次,可能是局部变量太大。因此建议“把较大的数组放在main函数外。

竞赛题目

  1. 刽子手游戏

    1. 看输入字符和给定字符关系
    2. 使用全局变量可便于维护内容,可以免去过多的参数传递。
    3. 猜过的字母再猜一次算错:将猜过的字母从答案内“删去”(改成不可能满足为答案的条件的数据)
  2. 救济金发放
    1. 一圈官员,两个官员逆时,顺时针数k, m个数,停下,被选中的离开队伍(可能是同一个人)
    2. #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;
       }
  3. 信息解码
    1. 01字符串,长度会逐渐增加,且不存在全1的串。 编写一个解码程序,输入一个编码头,则序列的每个串对应一个字符。再编码文本。每个小结前三个数字表示编码长度,每小节以全1结束,编码以000结束。

原文地址:https://www.cnblogs.com/xuwanwei/p/10753888.html

时间: 2024-10-10 02:15:33

递归 段错误 习题的相关文章

Linux 段错误详解

By Falcon of TinyLab.org 2015/05/12 背景 笔者早年写过一篇:<可恶的"Segmentation faults"之初级总结篇>,网络转载甚多.多年下来,关于段错误的讨论依旧很热烈,该问题也还是很常见.所以打算在这里再系统地梳理一下该问题的来龙去脉. 什么是段错误 下面是来自 Answers.com 的定义: A segmentation fault (often shortened to segfault) is a particular

你的java/c/c++程序崩溃了?揭秘段错误(Segmentation fault)(3)

前言 接上两篇: 你的C/C++程序为什么无法运行?揭秘Segmentation fault (1) 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2) 写到这里,越跟,越发现真的是内核上很白,非一般的白. 但是既然是研究,就定住心,把段错误搞到清楚明白. 本篇将作为终篇,来结束这个系列,也算是对段错误和程序调试.寻找崩溃原因(通常不会给你那么完美的stackstrace和人性化的错误提示)的再深入. 本篇使用到的工具或命令: dmesg strace gdb l

一个由快速排序引发的段错误

今天在实现一个查找功能的时候,需要用到排序,因为用的是C开发,就把自己之前写的快速排序算法直接拿来用了.代码如下: 1 static void QuickSort(ElemType *array,int left,int right) 2 { 3 if(left > right) 4 { 5 return; 6 } 7 int i,j; 8 ElemType temp, base; 9 base = array[left]; 10 i = left; 11 j = right; 12 while

段错误(核心已转储)的原因

一.什么是段错误? 一旦一个程序发生了越界访问,cpu 就会产生相应的保护,于是 segmentation fault 就出现了,通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏. 二.段错误产生的原因 下面是一些典型的段错误的原因: 非关联化空指针--这是特殊情况由内存管理硬件 试图访问一个不存在的内存地址(在进程的地址空间) 试图访问内存的程序没有权利(如内核结构流程上下文) 试图写入只读存储器(如代码段) 1

程序猿之---C语言细节24(段错误、类型提升、sizeof &#39;A&#39;)

主要内容:段错误.类型提升.sizeof  'A' #include <stdio.h> int main() { union test{ char a[10]; int b; }u; int *p = (int *)&(u.a[1]); // 没有引起总线错误 *p = 17; printf("%d\n",*p); #if 0 int *q = 0; // 引起段错误,在linux中运行可看到段错误,在windows下运行时直接出错 *q = 1; #endif

什么是core dump linux下用core和gdb查询出现&quot;段错误&quot;的地方

什么是core dump   linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-3193279.html 有些时候我们在一段C代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了"段错误". 呵呵,这种问题我想很多人会经常遇到.遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没 有,如果我们一味的去看代码找太疼苦了,因为我们都相信自

函数栈溢出引起的段错误segmentation fault

遇到了一个奇怪的问题: 有一个回调函数中发生了段错误,但经检查也没有什么明显的错误,然后用排除法一点一点屏蔽,最后定位在一个函数里出错,但这个函数没什么明显错误.最后把入口参数改为引用传递就不报错误. 但隔了一段时间这个函数又报错了,原因是我加一行代码,但这行代码就是一个赋值语句:于是我不甘心,又开始排除法,最后定位到一个变量,加上它报错,不加就不报错:我一直怀疑是不是linux对一个函数的大小有限制:于是将这个函数换成全局变量,而在此函数中用的此变量时候采用指针,诶,不再报段错误了,世界终于安

结构体指针之 段错误 具体解释(segmentation fault)

一个网友问了我一个问题.一个C程序执行出现了段错误,这个问题非常好.非常多刚開始学习的人都easy犯这个错误,详细代码例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 这个编译没有问题,可是执行是段错误    Segmentation fault 由于你定义了一个结构体指针p.用来指向此类

段错误调试神器 - Core Dump详解

一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得困难起来. gdb: 有一种办法是, 我们用gdb的step, 一步一步寻找. 这放在短小的代码中是可行的, 但要让你step一个上万行的代码, 我想你会从此厌恶程序员这个名字, 而把他叫做调试员. 我们还有更好的办法, 这就是core file. ulimit: 如果想让系统在信号中断造成的错误时