我现在正在用C++测试堆和栈的地址区
我的代码是
#include <iostream>
using namespace std;
int g;
int uninitialized_g;
class Heap{
int a;
int b;
};
int main() {
int stack_variable = 3;
int stack_variable_1 = 3;
g = 3;
Heap * heap_class = new Heap;
Heap * heap_class_1 = new Heap;
cout << "Static initialized g's addr = " << &g << endl;
cout << "Static un-initialized g's addr = " << &uninitialized_g << endl;
cout << "Stack stack_variable's addr = " << &stack_variable << endl;
cout << "Stack stack_variable1's addr = " << &stack_variable_1 << endl;
cout << "Heap heap_class's addr = " << heap_class << endl;
cout << "Heap heap_class1's addr = " << heap_class_1 << endl;
delete heap_class;
delete heap_class_1;
return 0;
}
在带有 MinGW 的 windows eclipse 中,结果是
Static initialized g's addr = 0x407020
Static un-initialized g's addr = 0x407024
Stack stack_variable's addr = 0x22fed4
Stack stack_variable1's addr = 0x22fed0
Heap heap_class's addr = 0x3214b0
Heap heap_class1's addr = 0x3214c0
在 linux 中使用 g++ 结果是
Static initialized g's addr = 0x601180
Static un-initialized g's addr = 0x601184
Stack stack_variable's addr = 0x7ffff5c8c2c8
Stack stack_variable1's addr = 0x7ffff5c8c2cc
Heap heap_class's addr = 0x1c7c010
Heap heap_class1's addr = 0x1c7c030
这对我来说很有意义。
所以,问题是,
- 在windows结果中,为什么分配的堆内存地址有时比栈高?
- 在 Linux 中,堆寻址是有意义的。但是为什么栈地址变高了?
提前致谢。
最佳答案
您的程序在称为操作系统的环境中运行。因此,正如您可能预期的那样,有更多的代码在运行。
1) 栈和堆
第一个线程的栈地址由操作系统定义。您可以在请求某些特定值的 PE32 exe 文件头中设置一些值。但这至少在 Linux 上是不同的。 C 运行时库向操作系统请求一些内存。带有函数 s_brk 的 IIRC。操作系统可以随心所欲地提供内存。请记住,尽管您有线性地址空间,但您没有连续的内存布局。它更像是瑞士奶酪。
2) 局部变量的地址
这是一个未指定的行为。编译器可以自由地为局部变量分配内存中的顺序。有时我看到顺序是按字母顺序排列的(只需尝试重命名)或者它随着优化级别而变化。就接受吧。
关于c++ - 堆栈和堆地址区域在 Windows 和 Linux 中是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446991/