8.8.1 什么是內(nèi)存的動(dòng)態(tài)分配
棧:全局變量和局部變量,全局變量是分配在內(nèi)存中的靜態(tài)存儲(chǔ)區(qū)的,非靜態(tài)的局部變量是分配在內(nèi)存中的動(dòng)態(tài)存儲(chǔ)區(qū)的。
堆:數(shù)據(jù)臨時(shí)存放在一個(gè)特別的自由存儲(chǔ)區(qū)。
8.8.2 怎樣建立內(nèi)存的動(dòng)態(tài)分配
對內(nèi)存的動(dòng)態(tài)分配是通過系統(tǒng)提供的庫函數(shù)來實(shí)現(xiàn)的,主要有malloc,calloc,free,realloc這四個(gè)函數(shù)。
1.用malloc函數(shù)開辟動(dòng)態(tài)存儲(chǔ)區(qū)
其函數(shù)原型為:
void * malloc(unsigned int size);
作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長度為size的連續(xù)空間。
2.用calloc函數(shù)開辟動(dòng)態(tài)存儲(chǔ)區(qū)
函數(shù)原型為:
void * calloc(unsigned n,unsigned size);
在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長度為size的連續(xù)空間,這個(gè)空間一般比較大,足以保存一個(gè)數(shù)組。
3.用realloc函數(shù)重新分配動(dòng)態(tài)分配區(qū)
其函數(shù)原型為:
void * realloc(void *p,unsigned int size);
如果已經(jīng)通過malloc函數(shù)或calloc函數(shù)獲得了動(dòng)態(tài)空間,想改變其大小,可以用recalloc函數(shù)重新分配。
4.用free函數(shù)釋放動(dòng)態(tài)存儲(chǔ)區(qū)
其函數(shù)原型為
void free(void * p);
作用是釋放指針變量p所指向的動(dòng)態(tài)空間,使這部分空間能重新被其他變量使用。
8.8.3 void指針類型
不要把“指向void類型”理解為能指向“任何的類型”的數(shù)據(jù),而應(yīng)理解為“指向空類型”或“不指向確定的類型”的數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-671480.html
例8.30:建立動(dòng)態(tài)數(shù)組,輸入5個(gè)學(xué)生的成績,另外用一個(gè)函數(shù)檢查其中有無低于60分的,輸出不及格成績。文章來源地址http://www.zghlxwxcb.cn/news/detail-671480.html
#include<stdio.h>
#include<stdib.h> //程序中用了malloc函數(shù),應(yīng)包含stdib.h
int main(){
void check(int *); //函數(shù)聲明
int *pi,i;
p1=(int * )malloc(5 *sizeof(int)); //開辟動(dòng)態(tài)存儲(chǔ)區(qū),將地址轉(zhuǎn)換成int*型,然后放在p1中
for(i=0;i<5;i++)
scanf("%d",p1+1); //輸入五個(gè)學(xué)生成績
check(p1); //調(diào)用check函數(shù)
return 0;
}
void check(int *p){ //定義check函數(shù),形參是int*指針
int i;
printf("they are fail:");
for(i=0;i<5;i++)
if(p[i]<60)printf("%d",p[i]); //輸出不合格成績
printf("\n");
}
到了這里,關(guān)于8.8 【C語言】動(dòng)態(tài)內(nèi)存分配與指向它的指針變量的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!