计算机系统基础日志No.4

计算机系统基础日志No.4
深递归的例子

一,源程序及编译运行

1.源程序

/* Example of deep recursion */
#include <stdio.h>
#include <stdlib.h>

int recurse(int x) {
    int a[1<<15];  /* 4 * 2^15 =  64 KiB */
    printf("x = %d.  a at %p\n", x, a); 
    a[0] = (1<<14)-1;
    a[a[0]] = x-1;
    if (a[a[0]] == 0)
	return -1;
    return recurse(a[a[0]]) - 1;
}

int main(int argc, char *argv[]) {
    int x = 100;
    if (argc > 1)
	x = atoi(argv[1]);
    int v = recurse(x);
    printf("x = %d.  recurse(x) = %d\n", x, v);
    return 0;
}

2.编译运行

lwh@lwh-virtual-machine:~$ touch runaway.c
lwh@lwh-virtual-machine:~$ gedit runaway.c
lwh@lwh-virtual-machine:~$ gcc runaway.c
lwh@lwh-virtual-machine:~$ gcc runaway.c -o runaway
lwh@lwh-virtual-machine:~$ ./runaway
x = 100.  a at 0x7ffc26838c30
x = 99.  a at 0x7ffc26818c00
x = 98.  a at 0x7ffc267f8bd0
x = 97.  a at 0x7ffc267d8ba0
x = 96.  a at 0x7ffc267b8b70
x = 95.  a at 0x7ffc26798b40
x = 94.  a at 0x7ffc26778b10
x = 93.  a at 0x7ffc26758ae0
x = 92.  a at 0x7ffc26738ab0
x = 91.  a at 0x7ffc26718a80
x = 90.  a at 0x7ffc266f8a50
x = 89.  a at 0x7ffc266d8a20
x = 88.  a at 0x7ffc266b89f0
x = 87.  a at 0x7ffc266989c0
x = 86.  a at 0x7ffc26678990
x = 85.  a at 0x7ffc26658960
x = 84.  a at 0x7ffc26638930
x = 83.  a at 0x7ffc26618900
x = 82.  a at 0x7ffc265f88d0
x = 81.  a at 0x7ffc265d88a0
x = 80.  a at 0x7ffc265b8870
x = 79.  a at 0x7ffc26598840
x = 78.  a at 0x7ffc26578810
x = 77.  a at 0x7ffc265587e0
x = 76.  a at 0x7ffc265387b0
x = 75.  a at 0x7ffc26518780
x = 74.  a at 0x7ffc264f8750
x = 73.  a at 0x7ffc264d8720
x = 72.  a at 0x7ffc264b86f0
x = 71.  a at 0x7ffc264986c0
x = 70.  a at 0x7ffc26478690
x = 69.  a at 0x7ffc26458660
x = 68.  a at 0x7ffc26438630
x = 67.  a at 0x7ffc26418600
x = 66.  a at 0x7ffc263f85d0
x = 65.  a at 0x7ffc263d85a0
x = 64.  a at 0x7ffc263b8570
x = 63.  a at 0x7ffc26398540
x = 62.  a at 0x7ffc26378510
x = 61.  a at 0x7ffc263584e0
x = 60.  a at 0x7ffc263384b0
x = 59.  a at 0x7ffc26318480
x = 58.  a at 0x7ffc262f8450
x = 57.  a at 0x7ffc262d8420
x = 56.  a at 0x7ffc262b83f0
x = 55.  a at 0x7ffc262983c0
x = 54.  a at 0x7ffc26278390
x = 53.  a at 0x7ffc26258360
x = 52.  a at 0x7ffc26238330
x = 51.  a at 0x7ffc26218300
x = 50.  a at 0x7ffc261f82d0
x = 49.  a at 0x7ffc261d82a0
x = 48.  a at 0x7ffc261b8270
x = 47.  a at 0x7ffc26198240
x = 46.  a at 0x7ffc26178210
x = 45.  a at 0x7ffc261581e0
x = 44.  a at 0x7ffc261381b0
x = 43.  a at 0x7ffc26118180
x = 42.  a at 0x7ffc260f8150
x = 41.  a at 0x7ffc260d8120
x = 40.  a at 0x7ffc260b80f0
x = 39.  a at 0x7ffc260980c0
x = 38.  a at 0x7ffc26078090
段错误 (核心已转储)

二,函数释义及问题分析

1.argc、argv的具体含义

(在上篇日志中也有介绍)
argc和argv参数在用命令行编译程序时有用。main( int argc, char* argv[], char env ) 中
第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。
第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下:
argv[0]指向程序运行的全路径名
argv[1]指向在DOS命令行中执行程序名后的第一个字符串
argv[2]指向执行程序名后的第二个字符串
argv[3]指向执行程序名后的第三个字符串
argv[argc]为NULL
第三个参数,char
型的env,为字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。平时使用到的比较少。

2.atoi (表示 ascii to integer)

是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束符(’\0’)才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 。特别注意,该函数要求被转换的字符串是按十进制数理解的。

3.段错误 (核心已转储)

参考小时候挺菜的博客
段错误的可能原因:

一,访问不存在的内存地址
二,访问系统保护的内存地址
三,访问只读的内存地址
四,空指针废弃
五,堆栈溢出
六,内存越界(数组越界,变量类型不一致等)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值