c程序的内存布局,关于局部变量和全局变量的位置
Memory layout of c program, about the location of local variable and global varible
一些书籍和网页告诉我有关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++ 标准都没有指定对象在内存中的放置位置。他们绝对不会说任何关于内存段相对于彼此的位置。(事实上,有些架构甚至根本不将其代码和数据存储在相同的内存空间中!
虽然你的书中的陈述对于某些操作系统和架构可能是正确的,但绝不适用于所有操作系统和架构。现代地址空间随机化可能会通过随机放置堆栈、程序和堆地址来进一步混淆图片。
相关文章:
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 使用全局变量与局部变量和require
- 将变量声明为全局变量,然后声明为局部变量 -Shadowing-
- 局部变量如何隐藏全局变量
- 编译器是否可以从全局变量中读取两次,而不是存储一个局部变量
- 我不知道如何让我的程序使用局部变量而不是全局变量
- 怎么可能有两个同名的变量——一个是全局变量,另一个是局部变量
- 递归计算在不使用静态局部变量,全局变量或静态函数的情况下,在递归函数中发生的环数
- 初学者程序员 c++(局部与全局变量声明)
- 使用局部全局变量在单独的线程中运行C函数
- Arduino/C++全局变量与局部变量
- 编译器如何知道变量是全局变量还是局部变量(C)
- 当局部变量被复制到全局变量时,C++GCC优化速度会减慢
- 为什么局部变量不隐藏数组定义中的全局变量
- 要创建持久变量,最好是使用局部静态变量还是全局变量
- 全局变量和局部变量
- C++:全局变量与局部变量.使用什么
- C++-全局变量与局部变量的读/写速度
- 理解局部和全局变量:C++
- 在 C++ 中将局部变量分配给全局变量