问个比较掉价的有关问题
问个比较掉价的问题

如下程序
这问题有点掉价啊.....
------解决方案--------------------
"1234567890"
这种字符串直接量是在常量区的, 这个数据不会丢失的.
我觉得略奇特的是, 你不觉得你的test没有return语句么?
------解决方案--------------------
你的m是一个main里的指针,main还没有结束啊,
函数结束,又不会改变m指向的内存的数据,
还有一点,你命名能养成好的习惯吗?
------解决方案--------------------
好像test()没有返回值啊,这样怎么给m赋值呢?
------解决方案--------------------
那块数据没给系统, 因为你是用的"1234567890"这种形式, 它是在常量区, 你程序退出的时候才会回收:
http://blog.****.net/xcyuzhen/article/details/4543264
------解决方案--------------------
生命周期结束了,但是数据还是在那个地方的。指针销毁了而已吧?但是地址已经传递出去了,no problem
------解决方案--------------------
你这是在常量区域
执行一次后,就在那里待着了
到程序结束吧
------解决方案--------------------
数据在说明栈还没有被重新使用,不代表这样就是安全的吧
------解决方案--------------------
是的, 数组也可能在, 你那个字符串直接量是在常量区没有错, 同样的现象不同的道理.
在栈里局部变量退出的时候只是改栈指针而已, 之前的数据不会主动覆盖, 不安全.
但你的程序里的那个m指针, 是安全的. 不冲突
------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
------解决方案--------------------
汇编代码:
返回的是内存中的这两个地址:
0043202c
0043201c
只要内存中这两个地址中的内容没有销毁,那么,这个值就一直可以用。
如下程序
#include <iostream>
class A
{
public :
char * test();
private:
char *m;
};
char * A::test()
{
m = "1234567890";
}
char * test()
{
char *m = "0987654321";
}
void main()
{
A a;
char * m = a.test();
std::cout << m; //函数生命周期结束了,栈区数据怎么还在,我靠,没出问题? 以前一直用智能指针,没在意这个,今天看代码发现这么个问题;
m = test(); //函数生命周期结束了,栈区数据怎么还在,我靠,没出问题? 以前一直用智能指针,没在意这个,今天看代码发现这么个问题;
std::cout <<m;
}
这问题有点掉价啊.....
------解决方案--------------------
"1234567890"
这种字符串直接量是在常量区的, 这个数据不会丢失的.
我觉得略奇特的是, 你不觉得你的test没有return语句么?
------解决方案--------------------
你的m是一个main里的指针,main还没有结束啊,
函数结束,又不会改变m指向的内存的数据,
还有一点,你命名能养成好的习惯吗?
------解决方案--------------------
好像test()没有返回值啊,这样怎么给m赋值呢?
------解决方案--------------------
那块数据没给系统, 因为你是用的"1234567890"这种形式, 它是在常量区, 你程序退出的时候才会回收:
http://blog.****.net/xcyuzhen/article/details/4543264
------解决方案--------------------
生命周期结束了,但是数据还是在那个地方的。指针销毁了而已吧?但是地址已经传递出去了,no problem
------解决方案--------------------
你这是在常量区域
执行一次后,就在那里待着了
到程序结束吧
------解决方案--------------------
数据在说明栈还没有被重新使用,不代表这样就是安全的吧
------解决方案--------------------
是的, 数组也可能在, 你那个字符串直接量是在常量区没有错, 同样的现象不同的道理.
在栈里局部变量退出的时候只是改栈指针而已, 之前的数据不会主动覆盖, 不安全.
但你的程序里的那个m指针, 是安全的. 不冲突
------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
------解决方案--------------------
汇编代码:
12: m = "1234567890";
0040116D mov eax,dword ptr [ebp-4]
00401170 mov dword ptr [eax],offset string "1234567890" (0043201c)
18: char *m = "0987654321";
004011A8 mov dword ptr [ebp-4],offset string "0987654321" (0043202c)
返回的是内存中的这两个地址:
0043202c
0043201c
只要内存中这两个地址中的内容没有销毁,那么,这个值就一直可以用。