C語言內(nèi)存重點(diǎn)知識的講解與習(xí)題練習(xí)
1 程序設(shè)計(jì)的本質(zhì)
所謂程序就是由語句來操作存放在計(jì)算機(jī)內(nèi)存中的數(shù)據(jù)。
程序設(shè)計(jì)就是對內(nèi)存直接或間接地使用??梢娏私鈨?nèi)存分配乃是編程者的第一要務(wù)。
2變量的屬性
對變量起作用的屬性有兩個(gè):數(shù)據(jù)類型和存儲類型
不同的存儲類型提供了變量的作用域,鏈接及存儲時(shí)期的不同組合
所謂作用域就是一個(gè)標(biāo)識符能夠起作用的范圍
①函數(shù)原型作用域 函數(shù)
②代碼塊作用域 局部變量和函數(shù)參數(shù)
③文件作用域 全局變量
3一個(gè)C變了具有下列鏈接之一
外部鏈接——一個(gè)標(biāo)識符能夠在其他編譯單元中或在定義它的編譯單元中的其他范圍被調(diào)用??? 全局變量
內(nèi)部鏈接——一個(gè)標(biāo)識符能在定義它的編譯單元中的其他范圍內(nèi)被調(diào)用,但是不能在其他編譯單元中被調(diào)用 靜態(tài)全局變量
空鏈接——僅能夠在聲明它的范圍內(nèi)被調(diào)用
4一個(gè)C變量具有一下存儲時(shí)期之一
靜態(tài)存儲時(shí)期(static)和自動存儲時(shí)期(auto)
static變量分配在靜態(tài)存儲區(qū),在程序運(yùn)行期間不釋放
static局部變量程序結(jié)束時(shí)釋放,但是它的作用域也僅僅是在函數(shù)或者塊的內(nèi)部可見盡管如此我們可以使用指針在它不可見的位置來訪問它
static局部變量在編譯時(shí)進(jìn)行初始化,且僅作一次初始化
如果不賦初值,在編譯時(shí)會自動賦值為0。
注意:對于具有文件作用域的變量,關(guān)鍵字static表明鏈接類型,并非
存儲時(shí)期,表示變量具有內(nèi)部鏈接
例:#include
?
#include
存儲類? 時(shí)期? 作用域 鏈接? 聲明方式
?自動???????????? 自動????? 代碼塊 空???? 代碼塊內(nèi)
寄存器自動 代碼塊 空 代碼塊內(nèi),使用register 具有外部
鏈接的靜態(tài) 靜態(tài) 文件 外部 所有函數(shù)之外 具有內(nèi)部
鏈接的靜態(tài) 靜態(tài) 文件 內(nèi)部 所有函數(shù)之外,使用static
空鏈接靜態(tài)? 靜態(tài) 代碼塊 空??? ? 代碼塊內(nèi),使用static
5 內(nèi)存劃分:
棧區(qū)? 存放局部數(shù)據(jù)
??? ?由系統(tǒng)按棧原則管理
??? ?編譯時(shí)就已經(jīng)“規(guī)劃”好了,運(yùn)行時(shí)才使用
??? ?短命,函數(shù)執(zhí)行完則釋放。
??? ?用戶無法干預(yù)變量的誕生和消亡
靜態(tài)區(qū)?? 存放static修飾的數(shù)據(jù)和全局?jǐn)?shù)據(jù)
?編譯時(shí)已確定并初始化了
?不按棧原則管理,但仍受“作用域”的制約
堆區(qū) 存放程序動態(tài)申請的數(shù)據(jù) malloc calloc
?長命
?無名
?用戶可以干預(yù)變量的誕生和消亡
?在程序運(yùn)行時(shí)才動態(tài)分配
?申請可能失敗
代碼區(qū) 存放程序的代碼 常量 不可以被修改
?存有程序的所有執(zhí)行代碼
?每段代碼都有名稱—函數(shù)名
?用戶無法干預(yù),只能通過函數(shù)名調(diào)用
C語言的動態(tài)內(nèi)存分配核心函數(shù)有: malloc( )、calloc( )申請堆內(nèi)存
free( )釋放堆內(nèi)存
注意:千萬不要對非NULL指針?biāo)赶虻亩芽臻g重復(fù)釋放。不可++ 或-- 釋放,釋放時(shí)候指針==NULL 兩者不可缺一
6
???????????????????????????? 分配機(jī)制/分配責(zé)任???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 釋放機(jī)制/釋放責(zé)任
靜態(tài)內(nèi)存????? 這種內(nèi)存在編譯時(shí)就規(guī)劃好了,在程序運(yùn)行期 間一直存在。是由編譯 器負(fù)責(zé)分配的。??? 程序退出時(shí)釋放,不用程序員參與。
棧內(nèi)存????????? 函數(shù)調(diào)用臨時(shí)創(chuàng)建的。為函數(shù)返回、函數(shù)形 參、函數(shù)中定義的局部 變量在棧里申請空間。函數(shù)退出時(shí)釋放,不用程序員參與。
堆內(nèi)存????????? 程序員根據(jù)需要用malloc等函數(shù)創(chuàng)建的內(nèi)存。??????????????????????????????????????????????????????????????????????????????????? 在適當(dāng)時(shí)機(jī)由程序員用free釋放。
?
習(xí)題 1打印文字練習(xí)。隨機(jī)產(chǎn)生要錄入的文字,用戶輸入錄入個(gè)數(shù),計(jì)算用戶錄入文字耗時(shí)。
?
#include
{
?int num_char;
?void _random(int number);
?int count_char(char * str_one,char* str_two);
?printf("請輸入要生成的字母個(gè)數(shù)n");
?
?scanf("%d",&num_char);
?int t1=time(NULL);
?
?_random(num_char);
?
?printf("%sn",str1);
?
?scanf("%s",str2);
?
?
?int right=count_char(str1,str2);
?float percentage=(float)right/num_char;
?int t2=time(NULL);
?int _time=(int)difftime(t2,t1);
?printf("輸入正確了%d個(gè)字母,正確率為%f%.n",count_char(str1,str2),100*percentage);
?printf("共用了%d秒n",_time);
?
}
void _random(int number)
{
?int i = 0;
?srand((unsigned)time(NULL));
?
?for(i;i<number;i++)
?{
??str1[i]=(char)(rand()%26+97);
?}
}
int count_char(char * str_one,char* str_two)
{
?int count=0;
?while(1)
?{
???if((*str_one==*str_two)&&(*str_one!='