鱼C论坛

 找回密码
 立即注册
查看: 2929|回复: 5

[已解决]为什么不能调试?

[复制链接]
发表于 2016-2-28 23:49:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

#include<stdio.h>

int main()
{
      
    int n=5;
    int l;
    int age(n);

    printf("%d\n",age(5));
}

int age(int k)
{
      if (k==10)
      {
            return 10;
      }

      else
      {
            return age(k-1)+2;
      }
}
   
//编译和链接都没有问题,就是不知道为什么不能调试?也打不印不出结果。
     
最佳答案
2016-2-29 00:07:43
        int age(int k);                //错误就 出现在这里,定义函数语句要 和下面的函数体 对应 才可以调用函数。
        printf("%d\n",age(5)); 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-29 00:07:43 | 显示全部楼层    本楼为最佳答案   
        int age(int k);                //错误就 出现在这里,定义函数语句要 和下面的函数体 对应 才可以调用函数。
        printf("%d\n",age(5)); 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-29 08:25:21 | 显示全部楼层


#include<stdio.h>

int main()
{
      
    int n=5;
    int age(n);

    printf("%d\n",age(5));
}

int age(k)
{
      if (k==10)
      {
            return 10;
      }

      else
      {
            return age(k-1)+2;
      }
}
// 我改成这样了,调试时出现下面图片这个提示
百度查询stack overflow(堆栈溢出)就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。 或者解释为 在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址,这样当过程返回时,程序就转而开始执行这段自编的代码了。
比如如下这段程序:
#include<stdio.h>
int main()
{
char name[8];
printf("Please type your name:");
gets(name);
printf("Hello.%s!",name);
return 0;
}
编译并且执行,输入ipxodiAAAAAAAAAAAAAAAA,执行完gets(name)之后,堆栈如下:
内存底部 内存顶部
name EBP ret
<-------[ipxodiAA][AAAA][AAAA]............
^&name
堆栈顶部 堆栈顶部
由于我们输入的name字符串太长,name数组容纳不下,只好向内存顶部继续写'A'。由于堆栈的生长方向与内存的生长方向相反,这些'A’覆盖了堆栈的老的元素。'EBP ret’都被'A'覆盖了。在main返回的时候,就会把'AAAA'的ASCII码:0x41414141作为返回地址,CPU会试图执行0x41414141处的指令,结果出现错误。这就是一次堆栈溢出!
图像 1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-29 09:11:11 | 显示全部楼层
#include<stdio.h>
int age(int k);
int main()
{

    int n=5;
    int l;
//   int age(n);

    printf("%d\n",age(5));
    return 0;
}

int age(int k)
{
      if (k==10)
      {
            return 10;
      }

      else
      {
            return age(k-1)+2;//这里进入了死递归
                                
      }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-29 09:11:45 | 显示全部楼层
你的设计有点问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-29 13:40:21 | 显示全部楼层
本帖最后由 xiaohu168888 于 2016-2-29 14:22 编辑
DAY 发表于 2016-2-29 09:11
你的设计有点问题


终于发现了,谢谢提醒应该是if(k==1)不是if(k==10),谢谢。



这里还有一点不明白,那就是n==5一直递减到2后,为什么n还要从2递增到5呢,也就是说答案为什么不是12而是18呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 20:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表