動(dòng)態(tài)分配內(nèi)存的意義:
1.存儲(chǔ)的數(shù)據(jù) 需要延長生命周期
2.一個(gè)指針變量需要存儲(chǔ)數(shù)據(jù),變量本身只能存地址,不能存數(shù)據(jù),需要分配內(nèi)存空間來存儲(chǔ)數(shù)據(jù)
常量字符串的內(nèi)存空間有系統(tǒng)自動(dòng)分配
在常量區(qū)里面分配 當(dāng)程序結(jié)束會(huì)被自動(dòng)釋放
例如:
堆: 如局部變量 int a = 10;離開作用域就自動(dòng)收回
常量區(qū): 常量 const int a = 1;只能初始化一次,程序結(jié)束后釋放。
靜態(tài)區(qū): static 靜態(tài)局部變量存儲(chǔ)于進(jìn)程的全局?jǐn)?shù)據(jù)區(qū),即使函數(shù)返回,它的值也會(huì)保持不變,但程序結(jié)束后也會(huì)自動(dòng)釋放
棧 自己申請(qǐng)的內(nèi)存
malloc
意思是(memory alloc)
需要導(dǎo)入頭文件#include <stdlib.h>或者#include <malloc.h>
格式為: 變量名= (類型 *) malloc (sizeof(類型)); //void malloc 為無符號(hào)型,可以適用于所有的變量類型
calloc
void *calloc([size_t]
功 能: 在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長度為size的連續(xù)空間,函數(shù)返回一個(gè)指向分配起始地址的指針;如果分配不成功,返回NULL。
realloc
使用realloc動(dòng)態(tài)改變已經(jīng)分配內(nèi)存的大小 (重新進(jìn)行分配)
增加或者減少
格式: 要改變的變量 = (類型 )realloc(要改變的變量, 大小sizeof(類型));
以上三種都 必須自己手動(dòng)釋放,否則會(huì)一直占用內(nèi)存,除非關(guān)機(jī)重啟
釋放
格式為:free(變量)
#include <stdio.h>
#include <stdlib.h>
//導(dǎo)入頭文件stdlib.h
如果直接用數(shù)組接受,會(huì)造成空間的大量浪費(fèi)
例如: char name[100] = {};
而動(dòng)態(tài)分配是用多少給多少
如果使用指針變量接收數(shù)據(jù)
必須先為這個(gè)指針變量分配一片指向的內(nèi)存空間
有內(nèi)存空間 才能存數(shù)據(jù)
int main(){
char *name ;
name = (char *)malloc(10*sizeof(char));
使用malloc (memory alloc)申請(qǐng)內(nèi)存空間
if(name == NULL){
// 申請(qǐng)內(nèi)存失敗
exit(EXIT_FAILURE);
}
scanf("%s", name);
printf("%s\n",name);
name = (char *)realloc(name, 20*sizeof(char));
//realloc動(dòng)態(tài)改變已經(jīng)分配內(nèi)存的大小
增加或者減少
if(name == NULL){
退出前必須將之前分配的內(nèi)存釋放掉,否則會(huì)占用內(nèi)存
free(name);
exit(EXIT_FAILURE);
}
//使用完畢必須自己手動(dòng)釋放內(nèi)存
free(name);
return 0;
}