求数组长度

hero_winner 2010-12-10 11:23:17

int* change(int* a, int* b) {
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
int result[2];
result[0] = *a;
result[1] = *b;
//cout<<sizeof(result)<<endl; //结果为8,设此处为1
return result;
}

int main(int argc, char* argv[])
{
int a = 5, b = 6;
int* e = change(c, d);
//cout<<sizeof(result)<<endl; //结果为4,设此处为2
cout<<e[0]<<" "<<e[1]<<endl;
return 0;
}


当注释1时,结果为:
4
-858993460 -858993460
当注释2时,结果为:
8
6 4198797
当注释1,2时,结果为:
6,5
当1,2都不注释时,结果为:
8
4
-858993460 -858993460
请帮忙解答一下,以上结果是怎么回事,为什么会出现这样的结果?
非常感谢了!
...全文
193 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Microsues 2010-12-11
  • 打赏
  • 举报
回复
LZ可以按以下三点来理解:
由程序自行给变量分配的内存在栈里,变量所属的作用域结束后,内存就被撤销
由malloc/new分配的内存在堆里,需要用free/delete释放内存或者程序结束后自动撤销内存
由static定义的变量内存在数据静态区,直到整个程序结束在撤销内存
[Quote=引用 12 楼 hero_winner 的回复:]

当我把int result[2]放在函数外面作为全局变量声明时,结果就正确了。
我以前是学java的,对C++的指针不了解。
做这个程序,根据各位的解答,我大概明白错误是怎么出现的了。
change()返回一个指向局部变量result的指针,但是因为result是局部变量,change()执行后,result就销毁了(至少不安全了),所以虽然返回了指针,但是指针指向的地址空间内存放的数据已……
[/Quote]
务实的幻想家 2010-12-11
  • 打赏
  • 举报
回复
楼主相当于返回了栈空间的指针,在函数change退出后,result所占的空间被收回,可能被后续的东西覆盖掉,总之其值是不确定
we_sky2008 2010-12-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hero_winner 的回复:]
当我把int result[2]放在函数外面作为全局变量声明时,结果就正确了。
我以前是学java的,对C++的指针不了解。
做这个程序,根据各位的解答,我大概明白错误是怎么出现的了。
change()返回一个指向局部变量result的指针,但是因为result是局部变量,change()执行后,result就销毁了(至少不安全了),所以虽然返回了指针,但是指针指向的地址空间内存放的数据已经……
[/Quote]
恩,
函数体内的非静态局部变量是被分配在栈上的。
qq120848369 2010-12-11
  • 打赏
  • 举报
回复
java里也有局部概念,不过与C语言差太多了,java太简化了,C语言更贴近于计算机与操作系统的理解,必须忘记java才行.
hero_winner 2010-12-11
  • 打赏
  • 举报
回复
当我把int result[2]放在函数外面作为全局变量声明时,结果就正确了。
我以前是学java的,对C++的指针不了解。
做这个程序,根据各位的解答,我大概明白错误是怎么出现的了。
change()返回一个指向局部变量result的指针,但是因为result是局部变量,change()执行后,result就销毁了(至少不安全了),所以虽然返回了指针,但是指针指向的地址空间内存放的数据已经没有了。
不知道我的理解是否正确,还有对于大家说的栈空间,不明白是什么意思,难道是函数内的局部变量分配的就是栈空间?
qq120848369 2010-12-11
  • 打赏
  • 举报
回复
是8字节,不是4字节,这里是数组不是指针啊.
luciferisnotsatan 2010-12-11
  • 打赏
  • 举报
回复
即使在堆上分配,sizeof(result)也是4字节
这里的result是指针的大小。

C++里,用vector吧
一根烂笔头 2010-12-11
  • 打赏
  • 举报
回复
总是有许多人喜欢用一个函数返回一个局部变量,这样做存在不安全性!
一根烂笔头 2010-12-11
  • 打赏
  • 举报
回复

int* e = change(c, d);//哪里来的cd,你都没有声明它的存在

qq120848369 2010-12-11
  • 打赏
  • 举报
回复
1,sizeof(result)的确是2*4=8.
2,局部数组离开函数就不能使用了.
就想叫yoko 2010-12-11
  • 打赏
  • 举报
回复
result是函数change里面在栈上保存的数据,它的生存期就是在change函数被调用的时候,出了change函数系统会释放它,你在去使用它就可能出现错误,虽然系统可能不会立即释放,当你也不应该再使用它。
xyxz341 2010-12-11
  • 打赏
  • 举报
回复
用函数返回一个局部变量的时候,如果返回的是一个指针类型或者引用的话,会出问题的,因为在返回的时候函数调用结束,返回的空间已经被收回,空间中的值很可能已经不是之前的那个局部变量了!
we_sky2008 2010-12-10
  • 打赏
  • 举报
回复
楼主相当于返回了栈空间的指针,在函数change退出后,result所占的空间被收回,可能被后续的东西覆盖掉,总之其值是不确定的
we_sky2008 2010-12-10
  • 打赏
  • 举报
回复
对于你遇到的问题的解释是:
在1处,sizeof(result);这里的result是数组,所以其大小就是数组所占的内存大小32位下面就是8个字节
在2处,cout<<sizeof(result)<<endl;不报错吗? result的定义在哪呢?是其他文件的变量吗?
無_1024 2010-12-10
  • 打赏
  • 举报
回复
result 是int*
result的生命周期不一样啊
we_sky2008 2010-12-10
  • 打赏
  • 举报
回复
楼主在change函数返回了栈地址result;
result在函数change返回后空间被收回,
所以这个空间的值是不确定的

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧