C++中内存的问题

发布于 2022-08-30 00:03:32 字数 655 浏览 36 评论 0

代码如下:

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

半寸时光 2022-09-06 00:03:32

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

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

海风掠过北极光 2022-09-06 00:03:32

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

梦与时光遇 2022-09-06 00:03:32

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

说好的呢 2022-09-06 00:03:32

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

似梦非梦 2022-09-06 00:03:32

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

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

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

四叶草在未来唯美盛开 2022-09-06 00:03:32

这种情况不同的编译器会有不同的结果。数据越界后就不可控了,编译器也不负责正确性。

一袭水袖舞倾城 2022-09-06 00:03:32

我用GCC编译之后,结果仍然是不变的,我猜你是用VC++编译的吧(看到你写 void main...)。main之前声明的变量在内存的全局区,GCC能保证每个变量根据声明顺序从低地址到高地址排列,而VC++里面做了一些改动,目的可能是为了减少因内存对齐导致的内存浪费吧(这一点我不),所以a、b、c并不能保证一定在m[]之后。最好将这些变量的地址打印出来,这样才好判断变量的实际内存位置。

深空失忆 2022-09-06 00:03:32

在我的机器上运行结果一样,估计是跟编译器有关。我的环境是ubuntu 14.04, g++ 版本是4.8.2

橙味迷妹 2022-09-06 00:03:32

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

森林很绿却致人迷途 2022-09-06 00:03:32

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文