【原创】Windows编程学习笔记2:32位应用程序内存分配
相关链接:
Windows编程学习笔记1:Win32程序设计特点
http://forum.ikaka.com/topic.asp?board=55&artid=84204691.常见内存分配常见内存分配主要有两种,一种是帧分配(Frame Al
location,我认为翻译成帧分配并不合适,所以我通常记住英文名),一种是堆分配(Heap Al
location)。
帧分配对象存在于这样一块内存区域,它是暂时用来保存函数参数及局部对象。用通俗的话说,就是一个局部的临时空间,只在作用域内存在和可预见。例如,
void fun(void *p)
{
int a[256];
}
这也帮助我们去理解C基础教材中所谓变量作用域的描述。如果有兴趣的朋友可以在调试时对简单的代码进行反汇编,你就会更深刻的了解到作用于到底是什么东东。如果无法理解作用域,我举一个简单的例子:A进入电话亭打电话,此时电话亭内的人是A,打完以后出来了,这就是A作用域的终结。此时,B又进去打电话,电话亭里面的是B。同一个电话亭(可以理解为内存空间),在不同使用者(可以理解为对象)使用范围内(可以理解为作用域),为不同的人服务。所谓作用域,实际上就是同一个内存空间(或者是寄存器)的使用权限问题。这个资源到底是归谁使用,数据到底属于谁,这就是教材描述的变量作用范围。
另外一个问题变是C教材中函数参数传递的问题。一句绕口的话,“值传递是单向的,地址传递是双向的”,足可以让初学者迷惑。这到底是怎么回事?我希望用一句话可以解释清楚,那就是“参数传递永远是单向的”。值传递不需要累赘的解说,对于地址的传递如何理解呢?下面是一个例子:
{
....
fun(p1);//p1作为参数传递到了p2(反汇编的结果,就是一个值的复制)
....
}
...
void fun(void *p2)
{
*((byte)p2)=1;//p2指向对象(这里就是p1指向的对象)
p2=2;//p2指针重新赋值
}
在例子中,传递的是一个指针值(说白了,传递的就是一个值,和值传递一样)。教材为什么描述为双向?实际上双向指代的对象并非非形参和实参,而是传递的地址指向的内存空间是可双方都可访问的。
堆分配对象存在于程序保留的内存区域(与程序堆栈是隔离的)。实际上,这属于一个“外部”分配变量。下面是一个例子:
void fun()
{
void *p=malloc(....);
}
[用户系统信息]Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)