这段代码输出什么?? 我的分析哪里有错?

32131532 2011-03-17 11:16:35
int * p = NULL;

void func2()
{
int a=1;
p = &a;
}

void func1()
{
(*p)--;
}

int _tmain(int argc, _TCHAR* argv[])
{
func2();
int b;
for(b=1;b<10;b++)
{
func1();
cout<<b<<endl;
}
}

这个输出时什么? 为什么??

******************************************************

我的分析如下
func2();
int b;
cout<<"b :"<<&b<<endl;
for(b=1;b<10;b++)
{
func1();
cout<<b<<endl;
}

你看这段代码, 调用func2 时候 在栈区 入栈 a

执行完之后又出栈, 这时候p指针就指向刚刚入栈的位置。


然后b 入栈, p指向 b

然后在循环里 调用func1 这时候p指向的地址值减1, 也就是 b减了1,现在b是0了。

那么就会导致无限循环,输出0.
ACTION 22:57:01
为什么结果输出的是 1,2,3,4,5.。。


我把func1修改如下 , 就按预期 无限循环输出0了。
void func1()
{
(*(p-1))--;
}
...全文
123 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
32131532 2011-03-19
  • 打赏
  • 举报
回复
发现大家都没回到点上。

由于a出栈了,b入栈了,那么p的地址就是指向了b的。没错吧。

要不然不会出现下列情况

我把func1修改如下 , 就按预期 无限循环输出0了。
void func1()
{
(*(p-1))--;
}


肯定是什么原因多入栈了一个东西,导致p-1的地址才是b的地址。

大家多考虑一下。
左耳丁 2011-03-18
  • 打赏
  • 举报
回复
嘿嘿,新手的我也能看懂,好像调用func2根本就没起到什么作用,可能是为了迷惑人吧
gnuhpc 2011-03-18
  • 打赏
  • 举报
回复
首先(*p)表示a的值,b不受影响,其次,在fun2返回时按说应该是销毁a,但是编译器的实现上不一定完成这个操作,所以会继续。总之,这不是一个安全的方法,谁出的这个题目也挺脑残的,说真的,平时谁这么用……
碎碎念 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 maoxing63570 的回复:]

void func2()
{
int a=1;
p = &a;
}

不要返回一个局部变量的地址或者引用
[/Quote]

++
a的值在函数返回时,被销毁了...
is2120 2011-03-18
  • 打赏
  • 举报
回复
1. 首先不该返回指向局部变量的指针
2. 出现你分析的情况,和编译器有关,你生成汇编代码看下哈。
無_1024 2011-03-17
  • 打赏
  • 举报
回复
fun2使用了局部变量 换成全局变量或者static变量
maoxing63570 2011-03-17
  • 打赏
  • 举报
回复
void func2()
{
int a=1;
p = &a;
}

不要返回一个局部变量的地址或者引用
Ulfsaar 2011-03-17
  • 打赏
  • 举报
回复
p = &a;
(*p)--等价于a--即改变的是a的值,b当然不会受影响

64,639

社区成员

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

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