A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币

想不明白了m接收返回值和函数中return的顺序是什么样子的
func函数执行结束标志应该是}结束吧,那在它之前return语句应该是执行完了的,这个时候m没有接收到值吗?
如果m接收到值了,func函数执行结束,地址收回,那m的值是已经传出来了的,还会变吗?
转不过来这个弯了,求指教,谢谢:lol

最佳答案

查看完整内容

我觉得return &a;不合理在于 这个函数执行完,a就被释放了,a就不存在了,返回也就没有用了~

评分

参与人数 2黑马币 +26 收起 理由
LZZ + 6 对于初学者,很有帮助,赞一个.
guyinghua901018 + 20 求知可贵,不要奖励,反送黑马币~嘿嘿.

查看全部评分

16 个回复

倒序浏览
我觉得return &a;不合理在于 这个函数执行完,a就被释放了,a就不存在了,返回也就没有用了~
回复 使用道具 举报
int m=func();执行到这个语句时,会转到函数实现代码去执行,这个时候 你定义了一个int a;但没有初始化,a的值将会是垃圾,但这不妨碍下一条语句:return  &a,的执行,先取a的地址,然后返回。这个时候  int*m得到值是&a,然后执行printf,打印m的值。over。需要注意的是:如果你定义的函数有返回值,那么必须得有return语句返回一个值,然后程序就结束了,如果你定义一个void返回值的函数,不需要return ,当执行到}时,就结束了。至于m的值,函数func调用完成后。m的值是不会变的,但是如果你再执行一次这个程序,m的值是不缺定的,因为a是局部变量,随着函数的调用分配内存,随着函数结束释放,没一次执行都有可能具有不同的内存地址&a,。over
回复 使用道具 举报
亲 ,黑马币给我吧,这样的问题你不了解的地方就问,我一定让你懂
回复 使用道具 举报
我真想帮你,可是我还没学到那里的
回复 使用道具 举报
1:main函数在调用func时,进行了压入堆栈的操作,执行完成后,还需要pop出栈操作。实际上,当func执行return语句的时候就开始进行出栈操作了。也可以理解为,return执行完成后,func函数出栈完成,之后接着执行int *m = 地址的赋值语句。当m接受到值的时候,func已经彻底结束了,func肯定获取到值了。

2:func函数执行过程中,创建了int a变量,在堆栈中开辟了一块空间来存储变量a。函数内部的局部变量是随函数自省的,也就是在函数执行的过程中是合法存在的。func执行结束后将a变量所在的空间的地址传给了m,m是main函数中的一个变量,其所在的空间随main函数自省,main函数依然存在,m的值肯定是不会变的,只不过存储了一个地址指向的是一片非法空间。
回复 使用道具 举报
一步一个脚印 发表于 2015-3-23 17:01
int m=func();执行到这个语句时,会转到函数实现代码去执行,这个时候 你定义了一个int a;但没有初始化,a ...

按照你这么说 m应该是接受到值了得  为什么还报错了呢
回复 使用道具 举报
李大大 发表于 2015-3-23 22:39
我真想帮你,可是我还没学到那里的

哈哈哈 赶紧学
回复 使用道具 举报
261406938 发表于 2015-3-23 23:36
按照你这么说 m应该是接受到值了得  为什么还报错了呢

你的main函数没有return返回值
回复 使用道具 举报
261406938 发表于 2015-3-23 23:36
按照你这么说 m应该是接受到值了得  为什么还报错了呢

不好意思 ,刚才没有仔细看, 之所以报错可能跟编译器有一定关系。。。。比如我用gcc的编译器测试过,如果不加特殊的编译参数是没有问题的,值肯定返回过来了,只不过是个不合法的地址。。。。。。。编译器本身也有查错的功能,比如你定义个变量而不去使用,有的编译器也会报错。。
回复 使用道具 举报
houyunjuan 发表于 2015-3-24 00:20
你的main函数没有return返回值

话说我也不是太懂,编译器也是个很奇葩的东东,最好一切按照合法的编程规范来,不合法的最好不要去尝试。单单程序执行上来看是没有问题的。。。。只不过局部函数的栈地址传递有一定隐患,就跟你的main函数没有加return一样。。。。有时候可能没有错误报出,有时候可能只是报个警告,有的可能就直接扔个错误信息过来。
回复 使用道具 举报
你先想想你返回一个函数里的临时变量的地址有什么意义,这个地址别的变量也会用,编译器当然报错。你 a 改成 static 类型就可以了,因为这样地址不变。
回复 使用道具 举报
261406938 发表于 2015-3-23 23:36
按照你这么说 m应该是接受到值了得  为什么还报错了呢

我上面有这么讲:需要注意的是:如果你定义的函数有返回值,那么必须得有return语句返回一个值,然后程序就结束了  你的main函数定义了返回值为int  但是你没有通过return返回一个值,当然 如果你的main
函数 这么写: mian (){},你要在你的{}代码块中写上return 因为 编译器会默认这种形式的函数为隐式 的声明,认为main函数会返回int 值 。如果你不用return可以这么定义void  mian (void){}.这样就可以了
回复 使用道具 举报
这要用到栈的知识。所谓的栈是一种由“后进先出”特性的一种数据结构。而编程中,每个函数的其实都对应一个栈帧(stack frame)、而这些stack frame保存在调用栈中。所以执行顺序是,main函数入栈、然后是main函数中的func函数入栈。main先执行,所以先入栈、但在这过程中又有func函数的调用,所以func函数在作为一个stack frame入调用栈。此时调用栈是这样子。func 在 main上面。所以现在会先去执行完func函数,在返回执行main剩余的内容。所以int *m = func();当然是先去执行func函数里面的东西,执行完返回给m。
如果你还是不理解,可以试着用gdb调试,一个个栈帧的跟踪。
回复 使用道具 举报
能不能来点简单的  让我们躺捡点HMB
回复 使用道具 举报
内存回收和出现局部关联的问题,
回复 使用道具 举报
houyunjuan 发表于 2015-3-24 00:20
你的main函数没有return返回值

还有就是在定义变量a时没有初始化。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马