c程序的内存布局,关于局部变量和全局变量的位置

Memory layout of c program, about the location of local variable and global varible

本文关键字:局部变量 全局变量 位置 程序 内存 布局      更新时间:2023-10-16

一些书籍和网页告诉我有关C程序内存布局的知识。例如,堆栈位于比堆更高的地址,全局变量位于低于堆栈的位置。但我发现这不是真的:

D:\code>type testlayout.cpp

#include <stdio.h>
int g;

int main()
{
    int loc = 0;
    printf("%p %pn", &g, &loc);
}

D:\code>cl testlayout.cpp

Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.
testlayout.cpp
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.
/out:testlayout.exe
testlayout.obj

D:\code>testlayout.exe

000000013F2222C0 000000000022FB20

D:\code>

谁能解释为什么全局变量的地址大于局部变量的地址。

c(或 c++)程序的内存布局不是由 c(或 c++)标准定义的。你的书是出于无知,或者他们实际上已经说过这是一种典型的内存布局,或者对于特定平台上的特定编译器生成的程序来说,这种布局不一定与您的布局相同。由于未定义布局,因此不同平台上的不同编译器可能会使用他们认为实用的任何内存布局。

你的程序是 c++ 而不是 c,所以如果这样的布局是为 c 定义的,它不一定适用于你的程序。

C 和 C++ 标准都没有指定对象在内存中的放置位置。他们绝对不会说任何关于内存段相对于彼此的位置。(事实上,有些架构甚至根本不将其代码和数据存储在相同的内存空间中!

虽然你的书中的陈述对于某些操作系统和架构可能是正确的,但绝不适用于所有操作系统和架构。现代地址空间随机化可能会通过随机放置堆栈、程序和堆地址来进一步混淆图片。