免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1418 | 回复: 5
打印 上一主题 下一主题

关于栈的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-02 10:47 |只看该作者 |倒序浏览

  1. #include <stdio.h>

  2. int * ptr;

  3. void change(void) {

  4.         int i = 100;

  5.         ptr = &i;

  6. }

  7. void show(void) {

  8.         int j = 250;

  9.         printf("%d\n", *ptr);

  10. }

  11. int main(void) {

  12.         change();
  13.         show();

  14. }
复制代码


这段代码的输出结果为250,为什么?
我的猜想是,ptr指向了堆栈的顶部(或底部),也就是所有函数的第一个变量的内存位置。

[ 本帖最后由 iwinux 于 2006-9-2 12:02 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-09-02 10:55 |只看该作者
不是的,只是恰巧j的位置是之前i的位置。
void show(int i) {

        int j = 250;

        printf("%d\n", *ptr);

}
就不一样了

论坛徽章:
0
3 [报告]
发表于 2006-09-02 12:01 |只看该作者

  1. void show(int i) {

  2.         int j = 250;

  3.         printf("%d\n", *ptr);

  4. }
复制代码


是 i 先入栈还是 j 先入栈?

论坛徽章:
0
4 [报告]
发表于 2006-09-02 14:25 |只看该作者
原帖由 iwinux 于 2006-9-2 12:01 发表

  1. void show(int i) {

  2.         int j = 250;

  3.         printf("%d\n", *ptr);

  4. }
复制代码


是 i 先入栈还是 j 先入栈?


应该是 i 先入栈。j 在栈上创建。

论坛徽章:
0
5 [报告]
发表于 2006-09-02 15:22 |只看该作者
原帖由 iwinux 于 2006-9-2 12:01 发表

  1. void show(int i) {

  2.         int j = 250;

  3.         printf("%d\n", *ptr);

  4. }
复制代码


是 i 先入栈还是 j 先入栈?


两个变量本来就在不同的栈帧(stack frame)上,i在caller(main)的栈帧上,j在callee(show)的栈帧上。
看看汇编代码就知道了。

论坛徽章:
0
6 [报告]
发表于 2006-09-02 20:56 |只看该作者
提这个问题主要是因为我在《程序员2003合订本》里看到一段无限循环的程序,前几天刚刚看懂,今天拿来试验了一下。
程序大概是这样的:

  1. #include <stdio.h>

  2. int ptr;

  3. void addr(void) {

  4.         int i = 0;

  5.         ptr = &i;
  6. }

  7. void loop(void){

  8.         int i;

  9.         for (i = 0; i < 10; i++)
  10.                 (*ptr)--;                //这里其实修改了i的值,所以导致无限循环

  11. }

  12. int main(void) {

  13.         addr();
  14.         loop();

  15.         return 0;    //永远不会执行

  16. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP