首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

对局部变量(栈内存)的困惑解决方法

2012-05-29 
对局部变量(栈内存)的困惑C/C++ codevoid testFun(){void **poiter NULLif(!poiter){int i 10int *p

对局部变量(栈内存)的困惑

C/C++ code
void testFun(){    void **poiter = NULL;    if(!poiter)    {        int i = 10;        int *p = &i;        poiter = (void**)&p;     }    if (*poiter)    {        *poiter = (void*)0x0012f2d0;//这一句其实是操作上面代码块的局部变量p,                                    //可是p是属于上面代码块的局部变量啊,出了上面的代码块,                                    //p不就已经不存在了吗?可是这样的赋值操作为什么没报错??    }}


[解决办法]
强行赋值不会出错的。你用这个指针去访问内存才会出错的
[解决办法]
标准没有规定这样做会有什么后果,报不报错是不确定的,你这个平台不爆,换个环境可能就爆
c运行环境不可能检查出所有错误
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

[解决办法]
p已经无效了,但是那个内存还在那里。你用指向它的指针去访问它还是可以做到,尽管已经超出了语言的定义了,但编译器又不知道。
[解决办法]
简单地说,你可以使用指针访问内存中的任何位置
但除了你定义的那些变量(程序启动时自动分配内存)和你自己申请的那些内存空间外,其他任何地方你的访问都后果自负

p不存在?你确定你了解这句话的意思?
p是一个指针变量,p不存在又意味着什么?意味着这个指针变量不能被使用了,意味着这个指针变量所在的空间已经不再用于存放某个地址了,意味着这块内存已经在栈指针之外可能被用于其他用途了——如果你想让这块地址彻底不能被使用,那么砸碎内存条才是正道。
[解决办法]
是这样的,上面if块中变量p保存的是i的地址,也就是0x0012f2d0,当此if块结束时, if快里面的局部变量i和p都被
销毁了,也就是说你在下面的语句中无法再使用变量p,i了,但是0x0012f2d0这个地址还是存在的
所以这个赋值*poiter = (void*)0x0012f2d0;依然可以, 只不过你再访问这个内存的内容可能会引起系统报错

热点排行