突然发现一个很基础的问题(关于栈内存分配)

xzx214 2010-11-19 11:07:58
{
char b = 'a';
char a = 'a';
printf("%d\n",&b-&a);
return 0;
}

这段代码,按照我以前的理解来说,应该会输出1的,因为它们的内存分配是连续的。
但实际结果是12(编译环境vs2008/c++)不能理解。
变量a与b换成int型,调试的时候,内存是中间也会有8个cc是空着的。按照常理来说,栈内存的分配应该都是连续的啊,不可能中间会产生8个cc的。(见图)

...全文
170 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cswuyg 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wuxupeng999 的回复:]
至于谁在高地址、谁在低地址,编译器按照先定义的在低,后定义的在高。
[/Quote]
说得太快了。。。有点错误。
某一个变量在堆栈中的哪一个位置,跟编译器的优化和处理有关,有可能因为对齐问题会调整顺序,有可能因为变量被使用的先后而调整顺序.....
总之,它们在栈中的先后顺序跟用C++语句定义的顺序有可能不同。
~~~
多谢11楼的提醒。
GingerJWS 2010-11-20
  • 打赏
  • 举报
回复
我测试的结果是3,这个还是编译器自己的处置,而且不同平台上得到的值也不一样。
还是那点,c++语言层次没有保证,这上面纠结是没有意义的;可以做一些有趣的尝试和探索,如果愿意向下了解编译原理相关的也不错,但是不要被迷惑了
zongzihe 2010-11-20
  • 打赏
  • 举报
回复

#include <stdio.h>
int foo()
{
int b = 1;
int a = 1;
printf("%d\n",&b-&a);
return 0;
}

int main(void)
{
foo();
return 0;
}

我这输出结果还是1.
zongzihe 2010-11-20
  • 打赏
  • 举报
回复

#include <stdio.h>
int foo()
{
char b = 'a';
char a = 'a';
printf("%d\n",&b-&a);
return 0;
}

int main(void)
{
foo();
return 0;
}

我这编译输出结果是1.
liu163169 2010-11-20
  • 打赏
  • 举报
回复
学习,加围观
peng_weida 2010-11-20
  • 打赏
  • 举报
回复
学无止境
GingerJWS 2010-11-19
  • 打赏
  • 举报
回复
你再测试一下这个,同样是一个sub esp, XX

int a;
int d;
int b;

int e = &a - &b;
e += &d - &b;

printf( "%d", e );

cswuyg 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gingerjws 的回复:]
引用 4 楼 wuxupeng999 的回复:

图没看到。
但可以猜到原因,你应该是用debug版本,试试release版本,会发现正常,但不是1,而是-1。
debug版本为了方便调试没有优化,可能会多分配一些内存方便调试。


不要做这种假设,这个和编译器的处置有关,c++语言层次不能保证。

而且你说的情况也是1而不是-1,这个和堆栈的分布有关,从高到低,先分配的地址大些……
[/Quote]
1、debug跟release就是你所说的“编译器的处置”。
2、“堆栈的分布有关,从高到低,先分配的地址大些”。这句话没错,但是用来对这个问题的解释就有问题了。

C++的语句被编译器处理,最后变成汇编语句。在汇编语句里,一句(sub esp, XX)就分配了main函数里需要的所有堆栈空间,并不存在所谓的先和后的问题。至于谁在高地址、谁在低地址,编译器按照先定义的在低,后定义的在高。

我在编译器(GCC、VS)上测试,结果就如我所说。
xzx214 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gingerjws 的回复:]
从高到低,先分配的地址大些……
[/Quote]

貌似release版的内存分配是从低到高的呢。
GingerJWS 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuxupeng999 的回复:]

图没看到。
但可以猜到原因,你应该是用debug版本,试试release版本,会发现正常,但不是1,而是-1。
debug版本为了方便调试没有优化,可能会多分配一些内存方便调试。
[/Quote]

不要做这种假设,这个和编译器的处置有关,c++语言层次不能保证。

而且你说的情况也是1而不是-1,这个和堆栈的分布有关,从高到低,先分配的地址大些
xzx214 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuxupeng999 的回复:]
图没看到。
但可以猜到原因,你应该是用debug版本,试试release版本,会发现正常,但不是1,而是-1。
debug版本为了方便调试没有优化,可能会多分配一些内存方便调试。
[/Quote]

嗯。非常感谢。。
xu_小兵 2010-11-19
  • 打赏
  • 举报
回复
不懂,学习下了!
cswuyg 2010-11-19
  • 打赏
  • 举报
回复
图没看到。
但可以猜到原因,你应该是用debug版本,试试release版本,会发现正常,但不是1,而是-1。
debug版本为了方便调试没有优化,可能会多分配一些内存方便调试。
xzx214 2010-11-19
  • 打赏
  • 举报
回复
很感谢楼上的回答,但是这里说成内存对齐也太牵强了点吧。
这是在main函数里面,不是结构体里面噢,而且中间相隔得也太多了点吧。
再看看这张图。两个连续定义的char类型变量,中间居然空出12个字符出来。
GingerJWS 2010-11-19
  • 打赏
  • 举报
回复
这个是不保证的,它两又不是在一个数组里。编译器可以决定怎么放,而且debug和release还不一样
無_1024 2010-11-19
  • 打赏
  • 举报
回复
内存对齐的问题!!!

64,649

社区成员

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

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