background image

p2 = (char *)malloc(20);

分配得来得 10 和 20 字节的区域就在堆区。

strcpy(p1,   "123456");   123456\0 放 在 常 量 区 , 编 译 器 可 能 会 将 它 与 p3 所 指 向

的"123456"优化成一个地方。

}

二、堆和栈的理论知识

2.1 申请方式

stack:

 

 

由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为 b 开辟空间

heap:

需要程序员自己申请,并指明大小,在 c 中 malloc 函数

如 p1 = (char *)malloc(10);

在 C++中用 new 运算符

如 p2 = (char *)malloc(10);

但是注意 p1、p2 本身是在栈中的。

2.2

申请后系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,

会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中

删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地

址处记录本次分配的大小,这样,代码中的 delete 语句才能正确的释放本内存空间。另外,

由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放

入空闲链表中。

2.3 申请大小的限制

栈:在 Windows 下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思

 

是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS 下,栈的大小是 2M(也

有的说是 1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,

将提示 overflow。因此,能从栈获得的空间较小。