内存四区中堆区见解

 

  堆区

  由程序员分配释放 若程序员不释放,则在程序结束后自动释放。

  堆区就像定义一样,由程序员自己分配,这里我们使用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;

  }

 

  这样我们就可以发现,堆区和栈区的不同,在堆区上分配的内存空间是不会自动释放的,除非当整个程序都运行完毕。所以如果在做一个大型项目的时候,为了节约资源,当我们不再用它或者很少再使用它的时候,我们可以将其释放掉,等到用的时候重新分配

  

posted @ 2017-09-18 22:14  SmartGame  阅读(409)  评论(0编辑  收藏  举报