局部变量在stack中的内存分配

nlh774 2012-02-13 12:25:36
为了验证局部变量在stack中的分配,在vs2005中写了个小程序,却发现输出有些意外。虽然地址是递减的,但是每个的差值却是12????sizeof(int)值为4,那么上述差值也应该是4啊。 若把数据类型int改成char,仍然是12.
//win7(32Bit)+vs2005
int main( )
{
int i,j,k,l;
i=j=k=l=1;
cout<<&i<<" "<<&j<<" "<<&k<<" "<<&l;
return 1;
}
************************************
output:
0012ff28 0012ff1c 0012ff10 0012ff04

我是在c++ programming today这本书上看到的局部变量在stack中的分配,书上讲的差值是4。!
...全文
195 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuanyuan_zangge 2012-12-07
  • 打赏
  • 举报
回复
都是牛人呀!!学习中···
icerlion 2012-02-24
  • 打赏
  • 举报
回复
字节对齐有关。
当然也有编译器优化的关系。如果不需要深入到底层的话,没有必要关心这些东西。之前我也debug过栈指针的变化,没多少意义。
除非你想crack一个程序
赵4老师 2012-02-17
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
h415640525h 2012-02-17
  • 打赏
  • 举报
回复
微软恶心的地方就是做了什么不告诉你
像这个单个变量没有连续存放肯定是它搞了什么东西(比如说优化啊、便于什么操作啊之类)
对存放地址做了一定的算法处理
而用数组的话,它还是会给你一块连续的内存的,一般指针+数字的操作也就用在连续内存上了
没必要对单个独立的变量i去指针+数字跳到j吧
程序员小迷 2012-02-14
  • 打赏
  • 举报
回复
在gcc4.2下运行,每个差值是4
quwei197874 2012-02-13
  • 打赏
  • 举报
回复
看看汇编是怎么样的
赵4老师 2012-02-13
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
nlh774 2012-02-13
  • 打赏
  • 举报
回复
楼上的强!!!
delphiwcdj 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 delphiwcdj 的回复:]
用release模式编译输出就是你希望的了
[/Quote]
gcc 4.1.2 -Wall -g 下的结果

(gdb) list main
1 #include <iostream>
2
3 int main()
4 {
5 int i,j,k,l;
6 i=j=k=l=1;
7 std::cout<<&i<<" "<<&j<<" "<<&k<<" "<<&l;
8 return 1;
9 }
10
(gdb) p &i
$4 = (int *) 0xbf8b5b90
(gdb) p &j
$5 = (int *) 0xbf8b5b8c
(gdb) p &k
$6 = (int *) 0xbf8b5b88
(gdb) p&l
$7 = (int *) 0xbf8b5b84
(gdb)
delphiwcdj 2012-02-13
  • 打赏
  • 举报
回复
用release模式编译输出就是你希望的了
nlh774 2012-02-13
  • 打赏
  • 举报
回复
水平还不够,,看不懂汇编

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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