免费注册 查看新帖 |

Chinaunix

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

请问函数的形参在什么时候分配内存? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-29 00:21 |只看该作者 |倒序浏览
还有一个问题,一个函数没有return语句,是不是什么都不返回啊?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2007-10-29 09:12 |只看该作者

回复 #1 holton 的帖子

形参不用分配内存,实参才需要(在调用时);第二个问题,不是,返回的是随机值,若不想要返回值,将其返回类型指定为 void。

[ 本帖最后由 MMMIX 于 2007-10-29 20:29 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-10-29 09:54 |只看该作者
>>>还有一个问题,一个函数没有return语句,是不是什么都不返回啊?

main函数例外

论坛徽章:
0
4 [报告]
发表于 2007-10-29 11:33 |只看该作者

  1. #include <stdio.h>

  2. int foo( void ) {
  3.     int a = 3;
  4.     char b = '5';
  5.     int nEax = 17;

  6.     __asm__ __volatile__( "mov $0, %eax\n\t" );

  7.     printf( "%d\n", (char)(a - b) );

  8.     __asm__ __volatile__( "mov %%eax, %0":"=r"(nEax)::"%eax" );

  9.     printf( "[in foo] eax: %d\n", nEax );
  10. }

  11. int main( void ) {
  12.     int ret = 9;
  13.     int nEax = 15;

  14.     __asm__ __volatile__( "mov $0, %eax \n\t" );
  15.     __asm__ __volatile__( "mov %%eax, %0 \n\t":"=r"(nEax)::"%eax" );
  16.     printf( "eax: %d\n", nEax );

  17.     ret = foo();

  18.     __asm__ __volatile__( "mov %%eax, %0 \n\t":"=r"(nEax)::"%eax" );
  19.     printf( "eax: %d\n", nEax );

  20.     printf( "ret: %d\n", ret );
  21.     return( 0 );
  22. }

复制代码

论坛徽章:
0
5 [报告]
发表于 2007-10-29 11:51 |只看该作者
在 foo 中的最后一条语句 printf( "[in foo] eax: %d\n", nEax ); 导致寄存器 eax 的值被改变为该 printf 语句的返回值,
于是在 main 中 ret = foo(); 获得的返回值就是寄存器 eax 的值了

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2007-10-29 20:31 |只看该作者
原帖由 ruoyisiyu 于 2007-10-29 09:54 发表
>>>还有一个问题,一个函数没有return语句,是不是什么都不返回啊?

main函数例外

其实函数只要其返回类型不是 void,都会有返回值(如果它返回的话),不管有没有 return。

论坛徽章:
0
7 [报告]
发表于 2007-10-29 23:22 |只看该作者
原帖由 MMMIX 于 2007-10-29 09:12 发表
形参不用分配内存,实参才需要(在调用时)


我看谭老的书怎么说是形参在发生函数调用时分配内存
调用结束后相应内存释放?

论坛徽章:
0
8 [报告]
发表于 2007-10-29 23:41 |只看该作者
原帖由 sky.ljp 于 2007-10-29 23:22 发表


我看谭老的书怎么说是形参在发生函数调用时分配内存
调用结束后相应内存释放?


是这样的。实参是用来初始化形参的,这叫虚实结合;实参也不必是位于存储区中的对象(比如实参也可以是一个表达式或常数。)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP