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

这是为什么?

阅读 7.5k
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

这应该和编译器和编译的环境有关,不同机子不同系统得到的结果基本都不一样。

新手上路,请多包涵

内存怎么排和太多东西有关系,编译器、编译环境、操作系统、优化参数。研究这个是很没意义的,还不如去研究汇编优化。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题