1. 程式人生 > >內存四區中堆區見解

內存四區中堆區見解

get 結束 目的 內存空間 發現 返回 堆區 首地址 copy

 

  堆區

  由程序員分配釋放 若程序員不釋放,則在程序結束後自動釋放。

  堆區就像定義一樣,由程序員自己分配,這裏我們使用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;

  }

  這樣我們就可以發現,堆區和棧區的不同,在堆區上分配的內存空間是不會自動釋放的,除非當整個程序都運行完畢。所以如果在做一個大型項目的時候,為了節約資源,當我們不再用它或者很少再使用它的時候,我們可以將其釋放掉,等到用的時候重新分配

  

內存四區中堆區見解