这是一个深度递归的例子。
#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;
}
1<<15
无符号数a的左移相当于将该数用二进制表示,左移n位就是把最高位n位移出,低位添加n个0的操作,左移操作相当于将该数乘以2^n次方。
无符号数a的左移相当于将该数用二进制表示,右移n位就是把低位n位移出,高位添加n个0的操作,右移操作相当于将该数除以2^n次方。
注意:上述两种操作对于有符号数不满足,因为有符号数最高位为符号位,进行左移或右移操作会使改变数的符号。
简单来说:
左移,后空缺自动补0;
右移,分为逻辑右移和算数右移
1)逻辑右移 不管是什么类型,空缺自动补0;
2)算数右移 若是无符号数,则空缺补0,若是负数,空缺补1;
int a[1<<15]; /* 4 * 2^15 = 64 KiB */
因为int整数型占4bytes,所以int a[1<<15]数组的大小为:4*2^15=64*2^10B=64KB
存储容量:是该存储设备上可以存储数据的最大数量,通常使用千字节(kb kilobyte)、兆字节(MB megabyte)、吉字节(GB, gigabyte)、太字节(TB ,terabyte)和PB(Petabyte)、EB(Exabyte)等来衡量。
1KB=2(10)B=1024B; 括号中的数字为2的指数(即多少次方)
1MB=2(10)KB=1024KB=2(20)B;
1GB=2(10)MB=1024MB=2(30)B。
1TB=2(10) GB=1024GB=2(40)B
1PB=2(10) TB=1024TB=2(50)B
1EB=2(10) PB=1024PB=2(60)B
1Byte(相当於一个英文字母,您的名字相当6Bytes(6B)。
Kilobyte(KB)=1024B相当於一则短篇故事的内容。
Megabyte(MB)=l024KB相当於一则短篇小说的文字内容。
Gigabyte(GB)=1024MB相当於贝多芬第五乐章交响曲的乐谱内容。
Terabyte(TB)=1024GB相当於一家大型医院中所有的X光图片资讯量。
Petabyte(PB)=l024TB相当於50%的全美学术研究图书馆藏书资讯内容。
Exabyte (EB)=1024PB;5EB相当於至今全世界人类所讲过的话语。
Zettabyte(ZB)=1024EB如同全世界海滩上的沙子数量总和。
Yottabyte(YB)=1024ZB相当於7000位人类体内的微细胞总和。
printf("x = %d. a at %p\n", x, a);
打印输出x的大小和它的地址
a[0] = (1<<14)-1;
对于二维数组a[3][3]中a,&a,a[0],&a[0],&a[0][0]的区别和含义
if (a[a[0]] == 0)
return -1;
递归函数结束的满足条件,即出口。
return recurse(a[a[0]]) - 1;
表示不断进行递归调用
int main(int argc, char *argv[])
第一个int argc,是记录你输入在命令行上的字符串个数;
第二个*argv[]是个指针数组,存放输入在命令行上的命令(字符串)。
x = atoi(argv[1]);
将字符串转为int型。
atof:将……转成float型;atoi:字符串转成int型;atol:将……转成long型
根据运行结果分析可知,当最后栈的分配到达最大值时,就会发生段错误,致使程序异常终止。因此,此程序可用来判断栈空间的大小。
思考练习以下命令:
-d:将代码段反汇编
-S:将代码段反汇编的同时,将反汇编代码和源代码交替显示,编译时需要给出-g,即需要调试信息。
-l:反汇编代码中插入源代码的文件名和行号。
-j section:仅反汇编指定的section。可以有多个-j参数来选择多个section。
objdump -d a.out # 简单反汇编
objdump -S a.out # 反汇编代码中混入对应的源代码
objdump -j .text -l -S a.out # 打印源文件名和行号