內存四區中堆區見解
堆區
由程序員分配釋放 若程序員不釋放,則在程序結束後自動釋放。
堆區就像定義一樣,由程序員自己分配,這裏我們使用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;
}
這樣我們就可以發現,堆區和棧區的不同,在堆區上分配的內存空間是不會自動釋放的,除非當整個程序都運行完畢。所以如果在做一個大型項目的時候,為了節約資源,當我們不再用它或者很少再使用它的時候,我們可以將其釋放掉,等到用的時候重新分配
內存四區中堆區見解