空悬指针疑问!

raking0216 2009-12-16 09:33:38
#include<iostream>
using namespace std;
int * add1(const int & a,const int &b)
{
int c=a+b;
cout<<"在函数add1的内部结果为"<<c<<endl;
return &c;
}
//哈哈,在编译这个函数的时候vc6.0给出了下面的警告:
//warning C4172: returning address of local variable or temporary

void main()
{
int a=1,b=2,*p;
cout<<"调用add1返回一个空悬指针\n";
p=add1(a,b);
cout<<"指针所指的值为"<<*p<<endl; //(1)
cout<<"指针所指的值发生改变 了吗?\n"<<(*p==3?"没有改变":"改变")<<endl; //(2)
}


为什么(1)语句*p是3而不是随机值,(2)语句中*p就是随机值?p不是空悬指针吗?
...全文
100 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeah_aly 2009-12-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 arong1234 的回复:]
内存的特点是:存得进,取不完。虽然c是临时变量,只要你脱离作用域之后,它所处得内存不被其他认修改,那么它得值就永远不变,这就是所谓得“取不完”

试试下面代码

C/C++ code
#include<iostream>usingnamespace std;int* add1(constint& a,constint&b)
{int c=a+b;
cout<<"在函数add1的内部结果为"<<c<<endl;int* pc=&c;return pc;
}void add2(constint&a,const& b)
{char buffer[100]="abcdefg";
memset(buffer,0,100);
}//哈哈,在编译这个函数的时候vc6.0给出了下面的警告://warning C4172: returning address of local variable or temporaryvoid main()
{int a=1,b=2,*p;
cout<<"调用add1返回一个空悬指针\n";
p=add1(a,b);
add2(a,b);
cout<<"指针所指的值为"<<*p<<endl;//(1) cout<<"指针所指的值发生改变 了吗?\n"<<(*p==3?"没有改变":"改变")<<endl;//(2)}
[/Quote]

支持~
arong1234 2009-12-16
  • 打赏
  • 举报
回复
内存的特点是:存得进,取不完。虽然c是临时变量,只要你脱离作用域之后,它所处得内存不被其他认修改,那么它得值就永远不变,这就是所谓得“取不完”

试试下面代码


#include <iostream>
using namespace std;
int * add1(const int & a,const int &b)
{
int c=a+b;
cout < <"在函数add1的内部结果为" < <c < <endl;
int * pc = &c;
return pc;
}

void add2(const int &a, const & b)
{
char buffer[100]="abcdefg";
memset(buffer,0,100);
}
//哈哈,在编译这个函数的时候vc6.0给出了下面的警告:
//warning C4172: returning address of local variable or temporary

void main()
{
int a=1,b=2,*p;
cout < <"调用add1返回一个空悬指针\n";
p=add1(a,b);
add2(a,b);
cout < <"指针所指的值为" < <*p < <endl; //(1)
cout < <"指针所指的值发生改变 了吗?\n" < <(*p==3?"没有改变":"改变") < <endl; //(2)
}

yy121086191 2009-12-16
  • 打赏
  • 举报
回复
int c是局部的
kouwenlong 2009-12-16
  • 打赏
  • 举报
回复
我想你的基础知识还是不过关。
return &c是返回c的引用,而不是返回c的地址。
你的程序错误,就不要在就错无论错误了。
raking0216 2009-12-16
  • 打赏
  • 举报
回复
既然不确定,为什么cout < <"指针所指的值为" < <*p < <endl; 显示:指针所指的值为3????
coolsy1989 2009-12-16
  • 打赏
  • 举报
回复
2楼答的非常好!!顶
winingsky 2009-12-16
  • 打赏
  • 举报
回复
LZ学习很仔细
jc_ontheroad 2009-12-16
  • 打赏
  • 举报
回复
add1() 返回的是一个局部变量的地址,但函数返回时,这个局部变量就被释放,它所占用的内存也就变得不确定了。
kouwenlong 2009-12-16
  • 打赏
  • 举报
回复
int * add1(const int & a,const int &b)
{
int c=a+b;
cout < <"在函数add1的内部结果为" < <c < <endl;
return &c;
}
这个就错了,c具有局部作用域,函数返回之后就不存在了。由于引用不能为空,因此return &c就错了。
剩下的就不用看了。
qqwx_1986 2009-12-16
  • 打赏
  • 举报
回复
p指向的是无效的,是未定义的行为,你那不过是内存覆盖了而已

64,686

社区成员

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

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