免费注册 查看新帖 |

Chinaunix

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

[函数] 同一个函数多次调用在进程中所用栈空间每次都一样吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-18 11:09 |只看该作者 |倒序浏览
如题,谢谢

论坛徽章:
0
2 [报告]
发表于 2006-03-18 11:58 |只看该作者
什么叫空间一样?
地址不一定

论坛徽章:
0
3 [报告]
发表于 2006-03-18 14:11 |只看该作者
谢谢回复

这样的:

  1. #include <iostream>
  2. #include <tchar.h>

  3. using namespace std;

  4. int *test(int i, int j)
  5. {
  6.         int m = i + j;
  7.                 return &m;
  8. }

  9. int *test1(int i)
  10. {
  11.         int m = i + 100;
  12.         return &m;
  13. }


  14. int _tmain(int argc, _TCHAR* argv[])
  15. {

  16.     int *pi1 = test(1, 2);
  17.         printf("%d----%d\n", pi1, *pi1); // 1244612----3  ------ A
  18.         int *pi2 = test(4, 5);
  19.         printf("%d----%d\n", pi2, *pi2); // 1244612----9  ------ A

  20.         int *p = test1(100);
  21.         printf("%d----%d\n", p, *p); // 1244616----200 ----- B

  22.         int *pi3 = test(7, 8);
  23.         printf("%d----%d\n", pi3, *pi3); // 1244612----15 ------ A


  24.         getchar();
  25.         return 0;
  26. }

复制代码


A 处调用多次同一个函数返回的栈地址都是相同的;
B 处调用不同的函数返回的栈地址不同,但如果 test1() 的形参个数和 test() 相同,则 B 处的地址也相同

所以,基于此是否可以得出一个结论:同一个函数多次调用在进程中所用的栈空间是相同的(包含调用、递归调用除外)

可以这样说吗 ? 发这个贴是想弄明白函数调用时的栈空间管理 , 请大家讲讲,谢谢

论坛徽章:
0
4 [报告]
发表于 2006-03-18 14:41 |只看该作者
不是很明白你的意思,很奇怪你为什么在函数中返回局部变量的地址干什么?
当函数退出时
test()和test1()中的m所占的栈空间都会被释放,所以再此调用函数test时由于压栈的顺序跟上次一样,新的m会覆盖旧m,
因此返回的地址一样.

论坛徽章:
0
5 [报告]
发表于 2006-03-18 14:46 |只看该作者
原帖由 nnnqpnnn 于 2006-3-18 14:41 发表
不是很明白你的意思,很奇怪你为什么在函数中返回局部变量的地址干什么?
当函数退出时
test()和test1()中的m所占的栈空间都会被释放,所以再此调用函数test时由于压栈的顺序跟上次一样,新的m会覆盖旧m,
因此返回 ...



返回局部变量只是为了测试。
就是想知道压栈的顺序、函数有返回值时栈的布局等有关函数调用的问题,这部分知识太欠缺了

论坛徽章:
0
6 [报告]
发表于 2006-03-18 14:52 |只看该作者
A跟B调用的不是同一个函数把.在C++里好像可以用同一个函数名定义不同的函数,这个叫
"重载".
函数不同地址当然就不同了.

论坛徽章:
0
7 [报告]
发表于 2006-03-18 15:02 |只看该作者
原帖由 seawind_83 于 2006-3-18 14:52 发表
A跟B调用的不是同一个函数把.在C++里好像可以用同一个函数名定义不同的函数,这个叫
"重载".
函数不同地址当然就不同了.

楼上可能也没明白lz的意思,
LZ可以修改test()


  1. int *test(int i, int j)
  2. {
  3.         int m = i + j;
  4.         printf("m--%d\n",&m);
  5.         int n=0;
  6.         printf("n--%d\n",&n);
  7.         int o=0;
  8.         printf("o--%d\n",&o);
  9.         return &m;
  10. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2006-03-18 18:55 |只看该作者
>想弄明白函数调用时的栈空间管理

每种CPU的方式不一样, 最权威资料是CPU厂家发布的Call Conventions

论坛徽章:
0
9 [报告]
发表于 2006-03-18 19:18 |只看该作者
如果在同一个地方压栈的话就是一个地址了。

论坛徽章:
0
10 [报告]
发表于 2006-03-18 23:31 |只看该作者
LZ试试这个:
void s2()
{
}
void s1()
{
s2();
}

main()
{
s1();
s2();
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP