栈是由编译器自动分配释放
堆由程序猿手动分配释放,如不释放最后可能由操作系统自动回收。比如用malloc分配的空间就在堆上。
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"
优化成一个地方。
}
那么在下面这段程序
ptr = (char *)malloc(0) /*顺便一提,在以前malloc函数返回的是char型指针,新的ANSIC规定返回值为void类型,所以如果需要赋值,要在malloc前加强制类型转换,如本题的char* 。*/
char *ptr;
if ((ptr = (char *)malloc(0)) ==NULL)
puts( "Got a null pointer ");
else
puts( "Got a valid pointer ");
输出结果为Got a valid pointer。
问题来了:指针为NULL时指向哪里?分配的空间为0时(即malloc(0))又指向哪里?
当使用malloc后,只有在没有足够内存的情况下会返回NULL,或是出现异常报告。
malloc(0):系统就已经帮你准备好了堆中的使用起始地址(不会为NULL)。但是你不能对该地址进行写操作(不是不允许),如果写了话,当调用free(ptr)就会产生异常报告(地址受损)。
这里还有一个描述