| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3331 人关注过本帖
标题:C++函数返回数组输出问题
只看楼主 加入收藏
tianxiao110
Rank: 1
等 级:新手上路
帖 子:63
专家分:1
注 册:2010-7-23
收藏
得分:0 
回复 6楼 ooole
  int*p=test();
这句是从右到左执行的,而第一个地址赋给了p,main函数不结束,p是不会释放的,而p里放的正是第一个元素的地址,因此第一个元素是对的而后面的就不对了;  而我上面所说的p不再指向数组的首地址,的意思是,虽然p里面保留了曾经数组的首地址,但此时p后面已经不是数组了。
2010-07-24 16:34
gq198718
Rank: 4
等 级:业余侠客
威 望:1
帖 子:86
专家分:200
注 册:2010-6-6
收藏
得分:0 
觉得2楼是对的
2010-07-24 17:04
mxs810
Rank: 9Rank: 9Rank: 9
来 自:火星
等 级:贵宾
威 望:16
帖 子:234
专家分:1122
注 册:2006-10-19
收藏
得分:0 
仔细看了一下你的程序,发现问题啦:

问题就在于你的 int *p = test();执行后,
p指向了test()中的局部变量arr的首地址。
你要明白一点,int arr[] = {1,2,3,4,5};
这种方式声明的局部变量在test结束的时候就释放了,
你看到的int *p = test();执行后的p的确是指向了arr
的首地址,但是此时的这个地址是自由的内存了,
别的代码也可以再次申请使用了;
当调用到p = p + 1时,
这个地址的内存又被使用了,也就是在你印象中p指向了不明确的内容~~

也就是我前边说的p = p + 1是非法操作~~~

好好研究一下,变量的作用域,及合适申请、释放地址就明白了~~

授人以鱼不如授人以渔
2010-07-24 22:42
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
以下是引用ooole在2010-7-24 12:04:34的发言:

我按照你的提示自己研究了下,我觉得可能是作用域的问题,因为我将数组定义为全局变量后得到的结果是正确的,那可能就是,数组在调用完test函数后被撤消了,如果撤销的话那么应该所有的值都是错误的,但是我输出的时候第一个值是正确的,所以这个地方还有点疑惑

你用的是什么编译器?

test 中的那个数组的生命期确实已经没了。因此打出什么值都是有可能的(这种情况一般在C中称做未定义)。至于为什么第一个值总是对的,以后的值总不对是怎么个不对法?每次运行都不正确,还是有时正确有时不正确?是没次不正确的数都一样,还是每次不一样看上去像是没有规律?发生这种现像是原因与编译器的处理有关。
2010-07-25 00:06
ooole
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2009-7-2
收藏
得分:0 
回复 10楼 南国利剑
运行正常!按照我以前的做法在打印出第一个数组元素后整个数组空间都被撤销,所以后面的输出是错误的,而用动态数组的话如果不去释放空间那么数组中的元素就一直存在,直到程序运行完,不知道这样理解对不对,如果正确的话就可以结贴了!
2010-07-25 09:46
ooole
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2009-7-2
收藏
得分:0 
回复 11楼 tianxiao110
恩,我现在的理解和你差不多,不过我认为数组的撤销是发生在p的第一次输出之后,不管输出的是p+1的值还是p+2的值
2010-07-25 09:50
ooole
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2009-7-2
收藏
得分:0 
回复 13楼 mxs810
恩,谢谢,分析的很到位
2010-07-25 09:51
ooole
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2009-7-2
收藏
得分:0 
回复 14楼 pangding
就是说如果我打印*p则得到的是1,如果我打印*(p+2)则得到的是3,但是如果第一次打印的是*p得到正确结果,再去打印别的比如*(p+3)则得到的是错误结果,如果第一次打印*(p+2)得到的是正确的结果,然后再去打印别的比如*p则得到的是错误的结果,而且错误的结果是变化的不是固定值。
2010-07-25 09:58
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:0 
回复 15楼 ooole
就是这样。虽然我们不必关心硬件,但是我们还是要清楚内存的分配情况的。

南国利剑
2010-07-25 12:20
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
反正这种回收了的空间就是不能再用了。使用动态分配就没问题。

不过像这种情况,要求调用者提供一个数组是更合理的。否则就会像这个例子这样,调个函数居然动态分配了空间,还得调用者想着回收。如果不是很了解那个函数的工作原理,非常容易忘记。是不好的实践方法。
不过作为演示程序理解栈分配和动态分配的区别,倒是还算合适~~
2010-07-26 00:01
快速回复:C++函数返回数组输出问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024262 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved