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

这是为什么?

内存管理 C++ 内存 内存分配

初笩ㄓ蘾蘾 10 years, 4 months ago

我用Xcode跑,不论数组前面是什么变量都是
0 0 0
1 2 3

一般而言环境的内存对齐总是和int型保持一致的(如果不用预编译参数设置的话),问题里所有变量都是int型,不存在被截断的可能,因此不管对齐的字节数是多少应该都不影响。

题主是在什么环境下测试的?

kyon.L answered 10 years, 4 months ago

应该是编译器把位置调了下方便对齐,可能d,e的时候正好对齐了,就那么排下来了,但是去掉了e就对不齐,所以把a挪过去了,依据我的猜想,还有回答当中的结果和你的不一样,我猜测是跟编译器有关的.

花泽☆香菜 answered 10 years, 4 months ago

你打算通过m来访问a, b, c?
话说你可以先把这几个的地址打印出来,看一下是不是按照你想的顺序排列的。

霹雳小狗屎 answered 10 years, 4 months ago

我这边两次结果都一样的.......全是123
你可以试试加&把地址打出来看看是怎么回事

红茶学长233 answered 10 years, 4 months ago

m[MAX] 就已经越界了,话说写错了的程序就不要分析它的行为了。

如果一定要知道,那么我告诉你,这段程序所做的一切都是幻觉,它已经在你不知道的情况下向三体人发送了地球的坐标,智子已经发射出来了。

我只是个宅 answered 10 years, 4 months ago

Your Answer