请问C++变量的内存地址的规律

左大神在这 2008-03-16 09:45:17
#include<iostream>;
using namespace std;
void main(){
int a = 100,b = 100,c = 100,*p[3];
p[0] = &a;
p[1] = &b;
p[2] = &c;

//输出指针地址
for(int k = 0;k<3;k++){
cout<<p[k]<<endl;
}

//输出指针指向的变量的值
for(int k = 0;k<3;k++){
cout<<*p[k]<<endl;
}

system("pause");
}

上边的代码运行后输出如下:
0012FF60
0012FF54
0012FF48
100
100
100
请按任意键继续. . .

我想请教下,这里变量的内存地址
0012FF60
0012FF54
0012FF48
有什么规律,这些值是怎么来的?谁能讲讲,谢谢.
...全文
460 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieao111 2008-11-26
  • 打赏
  • 举报
回复
mark
lsd1025 2008-11-26
  • 打赏
  • 举报
回复
以上都说清楚了!
温习一下,
sinux_1983 2008-11-26
  • 打赏
  • 举报
回复
除了c++语法规定了,剩下的都应认为是未定义的,即使知道也应装作不知道。
once_and_again 2008-11-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liyuzhu_1984 的回复:]
在栈内存中 变量的生长方向是向下的 就是后分配的地址小
在堆内存中 变量的生长方向是向上的 就是后分配的地址大
[/Quote].
whuyotc 2008-11-26
  • 打赏
  • 举报
回复
mark
lbh2001 2008-11-26
  • 打赏
  • 举报
回复
这是编译器实现决定的事情,编程中不要依赖这个,可移植性不好
self_control 2008-11-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bluewanderer 的回复:]
debug模式下每个int前后都会加一个int做保护。

函数结束的时候会对保护用的int进行检查,如果这里的数据被修改,说明程序有错。
[/Quote]

学习,还真没注意过
spofmy 2008-11-26
  • 打赏
  • 举报
回复
neusoft_neusoft 2008-03-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bluewanderer 的回复:]
debug模式下每个int前后都会加一个int做保护。

函数结束的时候会对保护用的int进行检查,如果这里的数据被修改,说明程序有错。
[/Quote]

高手正解!
bluewanderer 2008-03-18
  • 打赏
  • 举报
回复
debug模式下每个int前后都会加一个int做保护。

函数结束的时候会对保护用的int进行检查,如果这里的数据被修改,说明程序有错。
zgjxwl 2008-03-18
  • 打赏
  • 举报
回复
朋友,这是我用VC++6.0编译器编译这个程序产生的结果

*******************VC++6.0*********************
0012FF7C
0012FF78
0012FF74
100
100
100
请按任意键继续. . .
Press any key to continue

************************************************

看到没有,这里每个int类型的变量所占有的字节数为4
而且,我觉得你用的编译器应该可能是比较新版的VC(或者其他)
因为我用的比较老的了相对来说,比较老的编译器编译的时候
你上面的程序也是有错误的(这是对编译器不同而说的)
比较老的编译器会认为你的for语句里的K是属于重复定义
(而新的就会认为k具有语句作用域而不会认为是重复定义)
而你的可以运行,这就说明编译器不同的缘故了,和楼上所云
还有,分配变量的内存地址,它只是规定int型最少所占用的内存空间为4
但实际往往不一定是4,这要根据你的实际情况,比如说的编译器了什么的而定
当然还和你的机器有关
nicky_zs 2008-03-18
  • 打赏
  • 举报
回复
一个int型变量在32位的机器上是占用4个字节的。所以连续定义的int型变量的地址差应该是4。即使对齐,按4字节对齐是标准的,所以也会是这个结果。之所以你的结果相差不是4,是因为你在Debug模式下编译的。如果你去Release模式下编译,你就会发现连续定义的int型变量的地址间隔就是4。因为在Debug模式下,编译器加入的一些额外信息占用了空间,并且不会对代码做任何优化,完全按照源代码来产生机器码。你再去试一下。
yeing2008 2008-03-18
  • 打赏
  • 举报
回复
系统自动分配的。
thecorr 2008-03-18
  • 打赏
  • 举报
回复
最近正在看汇编,所谓段地址 偏移地址,不知道能不能回答你的问题。

仅给思路,具体你自己查一下,因为我也不敢说很明白。
okhere 2008-03-18
  • 打赏
  • 举报
回复
应该是没有规律的。
zzcwyu 2008-03-16
  • 打赏
  • 举报
回复
http://blog.chinaunix.net/u/16132/showart_221149.html
libaoxia 2008-03-16
  • 打赏
  • 举报
回复
字节对齐方式有关
billy1985 2008-03-16
  • 打赏
  • 举报
回复
局部变量在栈中分配内存 栈中的增长方向由高向低
至于每个指向int型变量的指针实际占用12字节,就如楼上所说的 跟你的编译器选项有关

liyuzhu_1984 2008-03-16
  • 打赏
  • 举报
回复
在栈内存中 变量的生长方向是向下的 就是后分配的地址小
在堆内存中 变量的生长方向是向上的 就是后分配的地址大
baihacker 2008-03-16
  • 打赏
  • 举报
回复
每个int实际占用了12字节...应该是本身只占用了4字节剩下的八个和你的编译器选项有关..
加载更多回复(1)

64,662

社区成员

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

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