堆区
由程序员分配释放 若程序员不释放,则在程序结束后自动释放。
堆区就像定义一样,由程序员自己分配,这里我们使用malloc函数来分配空间;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *getMem(int num)
{
char *p = NULL;
p = (char *)malloc(sizeof(char) * num);//在堆区分配一块内存,并将指针指向这块区域
if(p == NULL)//判断是否成功分配内存
{
return NULL;
}
return p;//这里返回的是地址,即在堆区上分配内存的首地址
}
int main()
{
char *tmp = NULL;
tmp = getMem(10);//将10传给形参num
//在堆区分配的内存空间在子函数运行完毕之后,是不会被析构掉
if(tmp == NULL)//判断是否成功分配内存空间,
{
printf("func the getMem() err\n");
return -1;
}
strcpy(tmp,"1122");//向tmp所指向的内存空间拷贝数据,而不是将数据copy到tmp变量里
printf("%s\n",tmp);//打印字符串
if(tmp != NULL)//如果tmp指向的不是空地址,则进入if语句
{
free(tmp);//将堆区分配的内存空间释放掉,但是tmp任然存放所分配空间的地址
printf("%s\n",tmp);//打印的是一堆乱码
}
tmp = NULL;//再次将其指向NULL
system("pause");
return 0;
}
这样我们就可以发现,堆区和栈区的不同,在堆区上分配的内存空间是不会自动释放的,除非当整个程序都运行完毕。所以如果在做一个大型项目的时候,为了节约资源,当我们不再用它或者很少再使用它的时候,我们可以将其释放掉,等到用的时候重新分配