内存位置

xiaolomg 2013-01-24 11:37:30
改写了JJ.Hou在池内春秋的代码:(VS2008下)
#include<string>
#include<iostream>
#include <boost/cstdint.hpp>
using namespace std;

class C1
{
public:
int m_Data[4];
};

int main()
{
printf("%d \n",sizeof(C1));
// 動態配置記憶體
C1* pc1 = new C1; // size:16
C1* pc12 = new C1; // size:16
C1* pc13 = new C1; // size:16
// 列印每個區塊之前的㆕個bytes
unsigned char* pc1c = (unsigned char*)pc1;
unsigned char* pc12c = (unsigned char*)pc12;
unsigned char* pc13c = (unsigned char*)pc13;

// 列印每㆒區塊的起始位址
printf("%p %p %p\n", pc1,pc12,pc13);
}

但结果不如预期:

间隔应该是16+4=20,可是明显是40,该如何理解呢?
...全文
141 7 点赞 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
风行踩火轮 2013-01-26
new的时候内存并不保证分配连续的区域给你,而且为什么能够打印多次,没看明白中间的253打印信息是什么情况,LZ能解释下么
  • 打赏
  • 举报
回复
阿麦 2013-01-25
换 C1* c = new C1[10] 看看 申请内存时,块和块之间可能会有一些其他的东东在里面,并不一定两次申请的内存是紧挨着的。 特别是DEBUG模式,需要加一些信息。
  • 打赏
  • 举报
回复
xiaohuh421 2013-01-25
C1* pc1 = new C1; // size:16 C1* pc12 = new C1; // size:16 C1* pc13 = new C1; // size:16 你为什么为认为会分配一个连续的内存给你呢??? 因为是不同的new, 肯定分配的地地址是不同的, 完全有可能两次分配间地址相差 1K, 2K ,1M...随机的. 因为系统new返回是要看当前内存情况, 在某些极端情况下, new还会失败. 所以你说的 相差了40也没什么不对. 只有栈中下面这样., 应该是连续的. C1 cp1; C1 cp2; C1 cp3;
  • 打赏
  • 举报
回复
okmime 2013-01-25
引用 4 楼 zhao4zhong1 的回复:
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linu……
楼主的小问题引爆了大问题
  • 打赏
  • 举报
回复
xiaolomg 2013-01-25
引用 4 楼 zhao4zhong1 的回复:
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo De……
赵大湿!
  • 打赏
  • 举报
回复
赵4老师 2013-01-25
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单! 指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认: 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物; 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。 这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑! 这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!! 提醒: “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 (Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习C和汇编的对应关系。” 不是一回事! 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
  • 打赏
  • 举报
回复
lee_鹿游原 2013-01-24
楼主再换成Release执行
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2013-01-24 11:37
社区公告
暂无公告