问个C++的函数调用堆栈的问题
sopro 2006-12-16 05:37:18 linux环境下我写了程序,如下:
#include <iostream>
using namespace std;
char* func()
{
char cArray[] = "123456";
return cArray;
}
int main()
{
char* p = func();
cout << hex << reinterpret_cast<int>(p) << endl; //以16进制输出p的地址
}
结果:
bf8bcc41 (每次结果不一样)
bff442c1
...
(或者其他数值)
我觉的很奇怪!
我们暂且不论我返回的是一个局部数组的首地址(我知道这是绝对应该避免的),就现在出现的问题,我感到困惑。
一个进程再虚拟地址空间的分布我大概是了解的。在kernel下面,也就是0xc000000地址之下应该是进程的stack(根据函数调用的情况动态变化)。那么,认为,既然是相同的程序运行,进程在虚拟地址空间中的分布应该是一摸一样的,局部数组的首地址那么也应该是同一个虚拟地址(当然,物理地址很可能不一样,但是进程看到的应该只能是虚拟地址)