2023-11-17 06:56来源:m.sf1369.com作者:宇宇
栈是自动分配 的,随用随回收。
堆这个分好多种的,以windows系统来说,你运行一个程序,就至少有两个堆,一个是进程默认堆,一个是动态分配堆 也就是C语言的中 malloc或者C++中的new分配的内存
说到本质其实没啥区别,都是虚拟内存。。
编译器在编译的过程中,遇到函数调用时,会加入几条汇编指令。这些汇编指令的作用是:
1 分配一段栈空间,用于存放被调函数的参数和局部变量。
2 call被用函数。
3 当被调函数返回时释放掉这段分配栈空间。
以上具体内容你可以找一篇c的汇编代码,看看栈底寄存器ebp和栈顶寄存器esp相关指令。
至于分配栈空间和释放栈空间是由被调函数还是调用函数处理,取决于函数名修饰约定,可参见。
你这里提供的地址并不是真是内存中的地址,而是程序中的虚拟地址。 比如你的程序执行时系统分配了2000个内存单元给你,程序A中的第0号单元跟程序B中的第0号单元在实际内存中当然是不一样的。 而我们在平时编程时说的,变量没有赋初值,有时候直接输出会出现非0数据,这种情况跟本问题的情况则不一样。 具体说的话,要牵涉到计算机操作系统、组成原理、编译原理等多门课程,建议你可以到互动出版社(www.china-pub.com.cn)搜索相关书籍。 ============================================ 如果要访问指定的内存空间,这在高级语言中是不支持的,因为高级语言是基于操作系统的,操作系统为了安全考虑不可能让你直接访问指定内存,想想你的程序在运行时,如果其他程序可以任意改变你拥有的内存数据,那还有什么安全性可言。 ============================================ 同学,好学是很好的,刨根问底有时候也是一种好习惯,但是要建立在一定的基础上,确实,你提的问题并不是不能实现,但是是在一定的前提下,至少目前的高级语言是不支持的,因为系统的内存保护关系,不会让你随意地跟在自家后花园里走一样。是的,softice可以做到,可是softice是驱动级的调试工具,你能跟上级领导吼为什么你能坐办公室,我不行吗,同样的,你写的仅仅是win32下运行的小小受限制的程序,并不能要求有如此高的权限,第一、你可以写出来,别人也可以,我们电脑中装的程序不下数十,每个程序都能随便修改内存数据的话,那系统早就乱套了;第二、你可以写,不代表你写的没错,即使是大师级的程序员也不能保证每次都能正确无误地写出完美的代码,如果一个不小心误修改操作系统的内存区域,很好,每天的编码工作将是不断地死机重启,你愿意吗。 最后,我并没有奚落的意思,每个人都是从最简单的Hello world开始,比尔盖茨能写出windows,他也是从这一步开始的,当然,中间还有很多步,别人能写的你也一定能写,这个我相信,但是,别人花费了数年数十年的研究才能写的,你现在就能写,抱歉,我不相信。
为了寻址速度的原因,所以内存管理采取了地址对齐的方式,即因为结构体成员中有double类型,所以对齐采用8个字节,也就是说成员f占8字节,n占8字节,str占32字节。
上面是VC默认的情况,你可以自己进行设置,方式为:在结构体类型前加上编译预处理命令
#pragma pack(1)
即可以显示按字节对齐时该结构体类型所占内存字节数,具体你可以看一下下面的例子
#pragma pack(1)
struct data
{
char str[13]; // 30
int n; // 4
double f; // 8
};
#pragma pack() //恢复原有设置
struct data2
{
char str[13]; // 30
int n; // 4
double f; // 8
}ss;
int main(void){
struct data ST;
printf(%d %d\n, sizeof(ST),sizeof(ss));
return 0;
}