局部变量,全局变量的指针赋值的问题

llxlkzs 2012-09-19 10:18:25
代码如下:
#include <iostream>
using namespace std;

int* pint;
void fun1()
{
int a = 10;
pint = &a;
}
void fun0()
{
fun1();
int b = 11;
cout<<pint<<" 0 "<<*pint<<endl;
pint = &b;
}
void fun()
{
fun0();
cout<<pint<<" 1 "<<*pint<<endl;
}
void main()
{
fun();
cout<<pint<<" 2 "<<*pint<<endl;
}
输出结果如下:
0012FE7C 0 10
0012FEDC 1 4200563
0012FEDC 2 1244972
我不明白的是:为什么fun0()里*pint的值是10,而fun()里的*pint的值不是11!
求解答!
...全文
804 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaoZero41 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

野指针问题。
cout时的pint都是指向了内容不定的内存。出函数后这块内存被释放,没重新分配他用的话值就保存着,否则就抹除了。
项目里这么用你就死定了。。。
[/Quote]

LZ要好好温习一下有关结构体内变量生命周期的知识了,所有的指针都指向了临时变量
wqkjj 2012-09-19
  • 打赏
  • 举报
回复
因为pint在func0()中指向了一个局部临时变量b,这个临时变量在函数退出时会被释放,导致b原来所在地址的内容是不可预见的,也就是pint指向的地址内容是不可预见的,就是你显示的结果。
rydiy 2012-09-19
  • 打赏
  • 举报
回复
野指针问题。
cout时的pint都是指向了内容不定的内存。出函数后这块内存被释放,没重新分配他用的话值就保存着,否则就抹除了。
项目里这么用你就死定了。。。
yisikaipu 2012-09-19
  • 打赏
  • 举报
回复
这个简单的例子说明

func返回后p的内容是7
但是调用hanshu后,栈里的那个位置变成了8

倘若hanshu随便改一下
void hanshu()
{
void *r=hanshu;
}


那么输出就是一个地址。总之,这个位置变成了你预料不到的值,那也就是所谓的“随机”了
yisikaipu 2012-09-19
  • 打赏
  • 举报
回复
不要优化代码

int& func()
{
int i=7;
return i;
}

void hanshu()
{
int i=8;
}

int main()
{
int& p=func();

int x=p;

hanshu();

cout <<p <<endl;
cout <<x <<endl;

return 0;
}


输出结果如下
8
7
请按任意键继续. . .
yisikaipu 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]我听到一种说法是:当调用函数完成后,才真正释放掉被调函数的内容,即:当fun0()函数完成操作之后才真正释放fun1()里的内容,后来我在fun1()里在调用我随便写的fun2(),然后fun0()的*pint的输出值就变得随机了,这是不是就验证了那个书法呢?![/Quote]

不需要搞这么复杂

这些都要取决于具体的实现。从程序语言的角度看,就连栈都不是必须的

只能一般来说

除非是调试版加塞了代码,否则函数调用后,其栈帧内容不会主动清理掉,直至下一次函数调用是,栈帧才会被覆盖

你这个例子里调用来调用去,无非是用“下一次函数调用”去覆盖
llxlkzs 2012-09-19
  • 打赏
  • 举报
回复

[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

那fun1()调用完成之后,局部变量a不是也释放掉了吗?那为什么在fun0()里的*pint就能显示为10呢?


所谓释放,究竟是什么定义呢

你扔了个东西,接下来那个东西可能一直都还在那里,也可能立即被砸了,这就不完全取决于你了。反正你已经扔了就别再当作你的东西就是了
[/Quote]
我听到一种说法是:当调用函数完成后,才真正释放掉被调函数的内容,即:当fun0()函数完成操作之后才真正释放fun1()里的内容,后来我在fun1()里在调用我随便写的fun2(),然后fun0()的*pint的输出值就变得随机了,这是不是就验证了那个书法呢?!
yisikaipu 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

那fun1()调用完成之后,局部变量a不是也释放掉了吗?那为什么在fun0()里的*pint就能显示为10呢?
[/Quote]

所谓释放,究竟是什么定义呢

你扔了个东西,接下来那个东西可能一直都还在那里,也可能立即被砸了,这就不完全取决于你了。反正你已经扔了就别再当作你的东西就是了
llxlkzs 2012-09-19
  • 打赏
  • 举报
回复
那fun1()调用完成之后,局部变量a不是也释放掉了吗?那为什么在fun0()里的*pint就能显示为10呢?
llxlkzs 2012-09-19
  • 打赏
  • 举报
回复
那fun1()里a的内存不是也释放掉了吗?那为什么在fun0()里的*pint就能显示为10呢?
[Quote=引用 3 楼 的回复:]
引用 1 楼 的回复:

野指针问题。
cout时的pint都是指向了内容不定的内存。出函数后这块内存被释放,没重新分配他用的话值就保存着,否则就抹除了。
项目里这么用你就死定了。。。


LZ要好好温习一下有关结构体内变量生命周期的知识了,所有的指针都指向了临时变量
[/Quote]

64,646

社区成员

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

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