c 内存 变量分布

wpalhm 2007-12-25 01:59:39

学了这么久的c/c++。连他们的内存分布都还不清楚。想请教一下!

我写了这样的一段代码来测试变量在虚拟内存的分布情况:

int ia(0);
int ib(0);

static int sa(0);
static int sb(0);

int *paa = new int(0);
int *pbb = new int(0);

const int ca(0);
const int cb(0);

//输出变量的内存分布情况(虚拟内存)
cout << "local variable:\n"
<< "ia's address = " << &ia << '\n'
<< "ib's address = " << &ib << "\n\nstatic variable:\n"

<< "sa's address = " << &sa << '\n'
<< "sb's address = " << &sb << "\n\ndynamic variable:\n"

<< "paa point address = " << paa << '\n'
<< "pbb point address = " << pbb << "\n\nconstant:\n"

<< "ca's address = " << &ca << '\n'
<< "cb's address = " << &cb << endl;

delete paa;
paa = 0;
delete pbb;
pbb = 0;



我是在vs2003,window xp 测试的,结果如下:
local variable:
ia's address = 0012FED4
ib's address = 0012FEC8

static variable:
sa's address = 004585E0
sb's address = 004585E4

dynamic variable:
paa point address = 003711C0
pbb point address = 003711F0

constant:
ca's address = 0012FEA4
cb's address = 0012FE98
==============

局部变量: 高地址 --> 低地址
静态变量: 低地址 --> 高地址
动态变量: 不明确
常量: 不明确

请问我的这个断言正确吗?
那每两个局部变量之间为什么会差距8个字节?这之间是什么内容?


谢谢!!!!
...全文
166 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dtor 2007-12-26
  • 打赏
  • 举报
回复
高低是相对的,栈中分配的较低,堆中分配的较高。
wpalhm 2007-12-25
  • 打赏
  • 举报
回复
谢谢 大家
flyingwow99 2007-12-25
  • 打赏
  • 举报
回复
在DEBUG模式下,编译器可能在变量之间插入多余字节,并且都置一些特殊的值,比如FD,,当你的内存操作越界时将破坏这些特殊的值,这样可以方便你查找错误。。。
wpalhm 2007-12-25
  • 打赏
  • 举报
回复
我想这个跟编译器肯定有莫大的关系。
但这之间有没有一些可以遵循的规则呢?

calss_cyl 2007-12-25
  • 打赏
  • 举报
回复
只需要知道生命期就行 了,没必要说放在哪里。
温飞_会员 2007-12-25
  • 打赏
  • 举报
回复
编译器的事吧!

各种编译器长生的效果不同!你用Borland C++ 效果又不一样!
effective_person 2007-12-25
  • 打赏
  • 举报
回复

理解错了
全局变量和静态变量都放在 静态数据区
动态变量和本地变量都放在 动态数据区
wpalhm 2007-12-25
  • 打赏
  • 举报
回复
确实不需要连续。
那这个数字是不是固定的?都是8个字节!
或者加的这些汇编指令有什么用呢?
songjiegoodyear 2007-12-25
  • 打赏
  • 举报
回复
那每两个局部变量之间为什么会差距8个字节?这之间是什么内容?
====================================================

没有任何规定说两个变量的地址空间一定要连续啊,只有数组、结构这样的类型其内部元素/字段才是在内存中连续排列的

编译器会加入一些内容,比如汇编指令等等
wpalhm 2007-12-25
  • 打赏
  • 举报
回复
是8吧。它自己要占用4个字节啊!
effective_person 2007-12-25
  • 打赏
  • 举报
回复
不止有8 是12
local variable:
ia's address = 0012FED4
ib's address = 0012FEC8
wpalhm 2007-12-25
  • 打赏
  • 举报
回复
顶一下!
谢谢了!

64,682

社区成员

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

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