C++中内存的问题
代码如下:
#include < iostream> //为什么iostream前面的空格去掉就不能正常显示了?
using namespace std;
const int MAX = 100;
int d,e;
int m[MAX];
int a,b,c;
void main()
{
cout<<m[MAX]<<' '<<m[MAX+1]<<' '<<m[MAX+2]<<endl;
d=4;
c=3;
b=2;
a=1;
cout<< m[MAX]<<' '<< m[MAX+1]<< ' '<< m[MAX+2]<< endl;
}
以上的输出为
0,0,0
1,2,3
可见在内存中a,b,c是紧跟在m[]之后的。
可是,当稍微修改一下代码:> int d,e;
改为> int d;
输出就变成了
0,0,0
2,3,0
这是为什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
m[MAX]
就已经越界了,话说写错了的程序就不要分析它的行为了。如果一定要知道,那么我告诉你,这段程序所做的一切都是幻觉,它已经在你不知道的情况下向三体人发送了地球的坐标,智子已经发射出来了。
我这边两次结果都一样的.......全是123
你可以试试加&把地址打出来看看是怎么回事
你打算通过m来访问a, b, c?
话说你可以先把这几个的地址打印出来,看一下是不是按照你想的顺序排列的。
应该是编译器把位置调了下方便对齐,可能d,e的时候正好对齐了,就那么排下来了,但是去掉了e就对不齐,所以把a挪过去了,依据我的猜想,还有回答当中的结果和你的不一样,我猜测是跟编译器有关的.
我用Xcode跑,不论数组前面是什么变量都是
0 0 0
1 2 3
一般而言环境的内存对齐总是和int型保持一致的(如果不用预编译参数设置的话),问题里所有变量都是int型,不存在被截断的可能,因此不管对齐的字节数是多少应该都不影响。
题主是在什么环境下测试的?
这种情况不同的编译器会有不同的结果。数据越界后就不可控了,编译器也不负责正确性。
我用GCC编译之后,结果仍然是不变的,我猜你是用VC++编译的吧(看到你写 void main...)。main之前声明的变量在内存的全局区,GCC能保证每个变量根据声明顺序从低地址到高地址排列,而VC++里面做了一些改动,目的可能是为了减少因内存对齐导致的内存浪费吧(这一点我不),所以a、b、c并不能保证一定在m[]之后。最好将这些变量的地址打印出来,这样才好判断变量的实际内存位置。
在我的机器上运行结果一样,估计是跟编译器有关。我的环境是ubuntu 14.04, g++ 版本是4.8.2
这应该和编译器和编译的环境有关,不同机子不同系统得到的结果基本都不一样。
内存怎么排和太多东西有关系,编译器、编译环境、操作系统、优化参数。研究这个是很没意义的,还不如去研究汇编优化。