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。因此,能从栈获得的空间较小。