利用C++不使用递归,循环和goto,打印1到100 的某一答案分析
1 The below one works on my system, can't guarantee results though. 2 3 #include <iostream> 4 #include <stdlib.h> 5 int num; 6 void(**rptr)(); 7 void foo() { 8 if(num >= 100) exit(0); 9 std::cout << ++num << std::endl; 10 *rptr++ = foo; 11 } 12 int main() { 13 rptr = (void(**)())alloca(sizeof(*rptr) * 200) - 1; 14 foo(); 15 return 0; 16 }
注意他说在其他人的电脑不一定work,也就是说跟编译器或者机器型号有关
下面是他本人对这个答案的解释
The alloca call grows the stack downward and gives me a pointer to the top (lowest address) on the stack. It's right after this where the return address will be pushed on the stack when
Breakpoint 1, 0x0000000000400745 in main () (gdb) si 0x000000000040074a in main () (gdb) si 0x000000000040074e in main () (gdb) si 0x0000000000400753 in main () (gdb) si 0x0000000000400757 in main () (gdb) si 0x000000000040075a in main () (gdb) si 0x000000000040075f in main () (gdb) si 0x0000000000400764 in main () (gdb) si 0x0000000000400767 in main () (gdb) si 0x000000000040076b in main () (gdb) si 0x000000000040076e in main () (gdb) si 0x0000000000400771 in main () (gdb) si 0x0000000000400775 in main () (gdb) si 0x0000000000400779 in main () (gdb) info registers rsp rsp 0x7fffffffd300 0x7fffffffd300 (gdb) si 0x000000000040077d in main () (gdb) info registers rsp rsp 0x7fffffffd300 0x7fffffffd300 (gdb) si 0x0000000000400781 in main () (gdb) info registers rsp rsp 0x7fffffffd300 0x7fffffffd300 (gdb) si 0x0000000000400788 in main () (gdb) info registers rsp rsp 0x7fffffffd300 0x7fffffffd300 (gdb) si 0x000000000040070d in foo() () (gdb) info registers rsp rsp 0x7fffffffd2f8 0x7fffffffd2f8 (gdb) si 0x000000000040070e in foo() () (gdb) info registers rsp rsp 0x7fffffffd2f0 0x7fffffffd2f0 (gdb) si 0x0000000000400711 in foo() () (gdb) info registers rsp rsp 0x7fffffffd2f0 0x7fffffffd2f0 (gdb) si 0x0000000000400717 in foo() () (gdb) info registers rsp rsp 0x7fffffffd2f0 0x7fffffffd2f0 (gdb) si 0x000000000040071a in foo() () (gdb) info registers rsp rsp 0x7fffffffd2f0 0x7fffffffd2f0 (gdb) si 0x0000000000400726 in foo() () (gdb) si 0x000000000040072d in foo() () (gdb) si 0x0000000000400731 in foo() () (gdb) si 0x0000000000400738 in foo() () (gdb) si 0x000000000040073f in foo() () (gdb) si 0x0000000000400740 in foo() () (gdb) si 0x000000000040070d in foo() () (gdb) info registers rsp rsp 0x7fffffffd300 0x7fffffffd300
注意标注红色的地方RSP的变化
最后一条语句
0x000000000040070d in foo() () 是直接从ret跳过来的,像上面说的一样,没有使用call,最后会导致rsp不断地址不断增长,并不断进入foo()函数 如果上面有什么说得不对的地方,请多多包涵。
转载于:https://www.cnblogs.com/simonlin/p/5836702.html
利用C++不使用递归,循环和goto,打印1到100 的某一答案分析相关推荐
- php暂停循环,在特定数量的递归循环后,PHP停止执行
我遇到的问题很奇怪. 在执行递归循环时会发生这种情况. 使用for循环或任何其他迭代执行相同任务时,不会发生这种情况. 在?21 000次以下递归调用函数时,一切正常. 超过此数字时会出现问题. 我的 ...
- php 递归栏目名叠加,thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归...
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归 本文实例讲述了thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法.分享给大家供大家参考,具体如下: 这 ...
- 递归找到节点后跳出递归循环
递归找到节点后跳出递归循环 在js 的递归循环中,找到了节点想跳出递归循环,如果是单纯的return或者break的时候,并没有阻止递归的循环 // 造一个树数据 const treeList = [ ...
- 91.video.ws index php_如何利用videojs实现视频列表循环播放(完整代码)
本篇文章给大家带来的内容是关于如何利用videojs实现视频列表循环播放(完整代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 庭审直播 .video-js { /* posit ...
- java跳出递归_在Java项目中如何跳出递归循环
在Java项目中如何跳出递归循环 发布时间:2020-11-25 17:16:07 来源:亿速云 阅读:114 作者:Leah 今天就跟大家聊聊有关在Java项目中如何跳出递归循环,可能很多人都不太了 ...
- javaScript使用递归循环遍历多层级对象方法(无限不定数层级)
1.需求 在做一个Echarts关系图项目的时候碰到一个需求,后端传过来的数据格式是这样子的: "data":{name:"小明",relation:nullc ...
- python setattr无限递归_如何避免使用setattr和属性setter来避免递归循环?
在调用setattr时,当试图设置某个带有setter的属性的值时,这将导致无限递归循环:class TypeSystem(object): def __setattr__(self, key, va ...
- php打印99乘法表加粗,PHP基础循环语句之打印99乘法表
PHP基础循环语句之打印99乘法表 指定位置-1两个99乘法表如果font多层php PHP打印数学的99乘法表要用到两个For循环,for循环是php流程控制语句中较常用到的一种,流程控制语句中的结 ...
- DL之LSTM之MvP:基于TF利用LSTM基于DIY时间训练csv文件数据预测后100个数据(多值预测)状态
DL之LSTM之MvP:基于TF利用LSTM基于DIY时间训练csv文件数据预测后100个数据(多值预测)状态 目录 数据集csv文件内容 输出结果 设计思路 训练记录全过程 数据集csv文件内容 输 ...
- MAT之PLS:利用PLS(两个主成分的贡献率就可达100%)提高测试集辛烷值含量预测准确度并《测试集辛烷值含量预测结果对比》
MAT之PLS:利用PLS(两个主成分的贡献率就可达100%)提高测试集辛烷值含量预测准确度并<测试集辛烷值含量预测结果对比> 目录 输出结果 实现代码 输出结果 实现代码 load sp ...
最新文章
- Ubuntu14.04上安装TensorRT 2.1操作步骤
- C++ string类的方法
- Wi-Fi与LTE走向融合,优势互补携手共赢
- HH SaaS电商系统的品牌模块设计
- 和push的区别_还没有理解let 和 const的用法和区别吗,几百字让你立马搞懂
- jquery.cookie中的操作
- html编辑器后怎么使用,html在线编辑器怎么用
- Elon Musk赞同“火星经济将依靠加密货币运行”言论
- JetBrains系列WebStorm等中文输入法无法跟随光标的问题的解决办法
- matlab 调用c++编译好的文件出现问题
- 2017 4月20日下午
- PowerPhotos:Mac照片库管理软件
- 02--Activiti初始化表
- 困扰我许久的痛楚:闭包
- Windows文件夹中文名称英文路径
- win10桌面记事本便签有哪款
- 如何处理设计的条码与打印出来的不一样的问题
- cocos Creator打包
- 如何快速的学习ssh框架
- ICMP报文格式详解