常量地址比全局变量的地址大还是小?按照C++对内存5大分区的说法,

_Fong 2012-12-01 01:52:56
从一些文章上得到的说法地址的顺序:栈>堆>全局(静态)变量>常量>代码;
我自己测试了几次,发现有时是常量地址比全局变量的地址大,而有时却常量地址比全局变量的地址小.
常量地址比全局变量的地址大还是小?或者不确定?
...全文
212 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂的红豆 2012-12-05
  • 打赏
  • 举报
回复
引用 5 楼 longfeng112 的回复:
引用 1 楼 pengjialaosan 的回复:楼主怎么测试的?发出来分享一下呗。 C/C++ code?123456789101112131415161718192021222324252627#include <iostream>using namespace std;#include <windows.h>int & Reference(){ in……
你的这个函数: int & Reference() { int m; int &n=m; return n; } 目的是用来测试程序代码内存区域的,这个代码编译是可以的,但是使用的会出错的。因为函数返回了一个局部变量(在栈区存储)的引用。 函数结束,变量m就不存在了,他的引用也就无意义了。
赵4老师 2012-12-03
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 《Windows PE权威指南》 MSDN98中的例子walker又名pwalk。 完整列出指定进程的内存使用情况,显示进程地址空间内容,装载哪些DLL,代码、数据、堆栈段分配在何处,可以用来检测内存泄漏,监测内存使用。 http://download.csdn.net/detail/zhao4zhong1/3667896
_Fong 2012-12-03
  • 打赏
  • 举报
回复
是win32 平台,今天测试又不同了,是不是这些所谓的布局是不是不确定的啊?越来越糊涂了.
notishell 2012-12-03
  • 打赏
  • 举报
回复
引用 5 楼 longfeng112 的回复:
引用 1 楼 pengjialaosan 的回复:楼主怎么测试的?发出来分享一下呗。 C/C++ code??123456789101112131415161718192021222324252627#include <iostream>using namespace std;#include <windows.h>int & Reference(){ i……
在不同的平台上应该有所不同,研究这些意义不大
_Fong 2012-12-03
  • 打赏
  • 举报
回复
引用 1 楼 pengjialaosan 的回复:
楼主怎么测试的?发出来分享一下呗。

#include <iostream>
using namespace std;
#include <windows.h>
int & Reference(){
	int m;
	int &n=m;
	return n;
}
int Global;				// 全局变量
int main(int argc, char * argv[]){
	int Stack;			// 存在栈空间
	static int Static;		// 静态/全局空间
	int *PToGlobal = &Global + 16;	// 指向全局/静态内存区域未分配初始化的地址;
	const int ConstVariable =5;	// const变量也存放在栈空间
	char * Constant = "abcd";	// 指向常量空间
	int & (*Code)() = Reference;	// 代码空间地址
	int * Heap = new int[10];
	printf("栈空间    Stack   :0x%p\n", &Stack);
	printf("堆空间    Heap    :0x%p\n", Heap);
	// 静态全局区域的值全部为0,解释为什么不用static值初始化就自动为0
	printf("全局/静态 Global  :0x%p, Static:0x%p, PToGlobal地址:0x%p, *PToGlobal:%d\n", &Global, &Static, PToGlobal, *PToGlobal);
	printf("常量      Constant:0x%p, ConstVariable:0x%p\n", Constant, &ConstVariable);
	printf("代码区    Code    :0x%p\n", Code);
	delete []Heap;
	system("pause");
	return 0;
}
自信男孩 2012-12-01
  • 打赏
  • 举报
回复
我们看到的都是虚拟地址,没有实际的物理地址。就是在CPU和内存之间有一个MMU,它是硬件完成的,我们看到的都是经过MMU映射过的地址。
彭家老三 2012-12-01
  • 打赏
  • 举报
回复
楼主怎么测试的?发出来分享一下呗。
sjjwan 2012-12-01
  • 打赏
  • 举报
回复
其实对于常量区也是针对栈、堆、静态区中的一个特殊区,表明该区域不能改变而以。比如全局声明一个const int a 100; 这样这个a是不占用内存的,编译系统是直接将a编译成直接数100的。而对于const int a = b; 这样的定义,常量a是占内存的,是在静态区分配了了内存,但只是标识为不可改变而以。
yisikaipu 2012-12-01
  • 打赏
  • 举报
回复
楼主用的是 Windows 吧

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧