動(dòng)態(tài)分配內(nèi)存

動(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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容