內(nèi)存分配的類型:
靜態(tài)內(nèi)存分配:
全局變量、靜態(tài)全局變量、靜態(tài)局部變量; 靜態(tài)內(nèi)存分配是在程序編譯時分配的內(nèi)存空間
-
全局變量
#include <stdio.h> int a; int main() { printf("%d\n"); return 0; }
在函數(shù)和代碼塊外部定義的變量是全局變量
定義一個全局變量時,變量在程序編譯時就分配內(nèi)存空間。全局變量可以在其他文件中訪問時要加上extern 關(guān)鍵字。在一處值發(fā)生改變其他文件中在使用時就會發(fā)生改變
-
靜態(tài)全局變量
在變量類型前加static
#include<stdio.h>
static double hp = 100;
int main ()
{
printf("%d\n", hp);
return 0;
}
靜態(tài)全集變量只能在當前文件的所有函數(shù)中被使用,其他文件中沒法使用。但可以定義一個名字相同的變量
-
靜態(tài)局部變量
在局部變量前加static 關(guān)鍵字,靜態(tài)局部變量的生命周期是從聲明到程序結(jié)束的
動態(tài)內(nèi)存分配:
局部變量:棧和堆;變量在程序運行時分配內(nèi)存
棧
棧的特點是:先進后出。
棧內(nèi)存空間由計算機自動分配和回收。生命周期在函數(shù)塊內(nèi)部,函數(shù)塊執(zhí)行結(jié)束,這塊內(nèi)存就自由了,可以讓其他變量訪問(內(nèi)存里的內(nèi)容在其它變量調(diào)用之前不會改變。
堆
堆空間是由程序員手動開辟的內(nèi)存空間。程序員不釋放這塊空間,它就不能讓其他變量訪問。
堆空間分配的變量沒有變量名,只能通過指針間接訪問堆空間里的內(nèi)容。
靜態(tài)存儲區(qū)
變量前面加static聲明后,這塊空間就被計算機分配到靜態(tài)存儲區(qū)中,生命周期是從聲明到程序退出。
static 聲明的變量在程序編譯時就分配空間。
例:如何釋放函數(shù)里面的malloc申請的堆空間
#include <stdio.h>
#include <stdlib.h>
int *a = NULL;
int *add()
{
a = (int *)malloc(sizeof(int));
*a = 8;
return a;
}
int main(int argc, const char * argv[])
{
add();
printf("%d\n", *a);
free(a);
return 0;
}
int *p = (int *)malloc(sizeof(int));//因為malloc 返回值是void *,需要進行類型轉(zhuǎn)化,才能把值賦值給其他指針變量