服务器经常崩溃??让我们来看看简单的内存知识:C语言——内存管理
學(xué)習(xí)重點(diǎn) :
1.全面掌握變量的特性,了解內(nèi)存管理的概念.
2.全面掌握函數(shù)的使用.
局部變量與全局變量:
局部變量:就是在函數(shù)內(nèi)部定義的變量.局部變量只在本函數(shù)內(nèi)有效,也就是只能在本函數(shù)內(nèi)使用它.
全局變量:就是在所有函數(shù)(包括main函數(shù))外部定義的變量.全局變量在整個(gè)源文件中有效,故全局變量可以在源文件中的任何地方使用.
注 :?c語言中,允許全局變量與局部變量重名,但全局變量不影響局部變量的值,也就是實(shí)際使用的是局部變量的值.
變量的特性 :
1.存儲(chǔ)期 :?也稱為生存期,表示變量在內(nèi)存中存在的時(shí)間的長短.
靜態(tài)存儲(chǔ)期 :
在程序編譯時(shí)就分配內(nèi)存空間并保持不變,程序執(zhí)行結(jié)束后才釋放.
動(dòng)態(tài)存儲(chǔ)期 :
在程序執(zhí)行并使用該變量的時(shí)候分配內(nèi)存空間,使用完畢立即釋放.
2.鏈接點(diǎn) :?表示變量能在哪些范圍內(nèi)使用.
內(nèi)部鏈接 :?只能在源文件內(nèi)部使用.
外部鏈接 :?能在源文件內(nèi)部和外部文件中使用.
空連接 :?只能在代碼塊內(nèi)(函數(shù)內(nèi)部)使用.
3.作用域 :?表示變量在哪些范圍內(nèi)起作用,由鏈接點(diǎn)決定.
1.局部變量 :?定義與聲明不區(qū)分(定義之后可以直接使用).
a.自動(dòng)變量 :?使用auto關(guān)鍵字修飾存儲(chǔ)類型,一般缺省.
定義聲明 :?[auto] <數(shù)據(jù)類型> <變量名>; //一般auto不寫 int a;直接這樣普通定義就行
變量特性 :?動(dòng)態(tài)存儲(chǔ)期,空鏈接,代碼塊作用域.
b.靜態(tài)局部變量 :?使用static關(guān)鍵字修飾存儲(chǔ)類型.
定義聲明 :?<static> <數(shù)據(jù)類型> <變量名>; //static int a;
變量特性 :?靜態(tài)存儲(chǔ)期,空鏈接,代碼塊作用域.
c.寄存器變量 :?使用register關(guān)鍵字修飾存儲(chǔ)類型.
register是一個(gè)請(qǐng)求命令,暗示該變量將被頻繁使用,請(qǐng)求保存在cpu寄存器中.用register修飾的變量的值必須是單個(gè)值,數(shù)據(jù)
長度小于或等于整型數(shù)據(jù)長度.因?yàn)樽兞康闹悼赡艽娣旁诩拇嫫髦?所以不能使用取地址符'&'獲取該變量的地址.
定義聲明 :?<register> <數(shù)據(jù)類型> <變量名>; //register int a;
變量特性 :?動(dòng)態(tài)存儲(chǔ)期,空鏈接,代碼塊作用域.
2.全局變量 :?定義與聲明有些地方需要區(qū)分.
a.普通全局變量 :
定義 :?<數(shù)據(jù)類型> <變量名>;
聲明 :?引用源文件內(nèi)部普通全局變量不需要聲明.
引用外部文件普通全局變量需要進(jìn)行申明 : <extern> <數(shù)據(jù)類型> <變量名>;
變量特性 :?靜態(tài)存儲(chǔ)期,外部鏈接,源文件內(nèi)部及外部文件作用域.
b.靜態(tài)全局變量 :
定義 :?<static> <數(shù)據(jù)類型> <變量名>;
聲明 :?引用靜態(tài)全局變量不需要申明.
變量特性 :?靜態(tài)存儲(chǔ)期,內(nèi)部鏈接,源文件內(nèi)部作用域.
注 : 靜態(tài)存儲(chǔ)期的變量并不一定是靜態(tài)變量.比如普通全局變量.
內(nèi)存管理:
程序一般是保存在計(jì)算機(jī)的外存中,運(yùn)行時(shí)自搬移到內(nèi)存中進(jìn)行運(yùn)行.
C語言中定義4個(gè)內(nèi)存區(qū)間:?代碼區(qū),靜態(tài)存儲(chǔ)區(qū),棧區(qū),堆區(qū).
1.代碼區(qū) :?用于存放程序中的代碼,屬性只讀.
2.靜態(tài)存儲(chǔ)區(qū):?用于存放普通全局變量,靜態(tài)變量(靜態(tài)全局變量,靜態(tài)局部變量),以及常量.
3.動(dòng)態(tài)存儲(chǔ)區(qū):
棧區(qū) :?用于存放普通局部變量.
堆區(qū) :?由程序員自行決定申請(qǐng)和釋放的內(nèi)存空間,稱之為堆區(qū).
典型的例子就是定義結(jié)構(gòu)體指針后,需要使用malloc()申請(qǐng)結(jié)構(gòu)體指針指向的內(nèi)存空間.
函數(shù):
1.函數(shù)的定義 :?[static] <函數(shù)返回值數(shù)據(jù)類型> <函數(shù)名>(形參表)
{
......
return 表達(dá)式;
} //例子:static int test(int x);
static關(guān)鍵字說明該函數(shù)只能在源文件內(nèi)部使用,為可選項(xiàng).
2.函數(shù)的聲明 :?[extern] <函數(shù)返回值數(shù)據(jù)類型> <函數(shù)名>(形參表);
extern關(guān)鍵字表明該函數(shù)在被調(diào)用時(shí),在外部文件中查找函數(shù)的定義,為可選項(xiàng)目.
3.函數(shù)的調(diào)用 :?被調(diào)函數(shù)必須時(shí)已經(jīng)在調(diào)用函數(shù)之前聲明,或者被調(diào)函數(shù)在調(diào)用函數(shù)之前定義.
調(diào)用方法 : 函數(shù)名(實(shí)參表);
4.指針函數(shù) :?函數(shù)的返回值是一個(gè)指針.
定義 :?[static] <函數(shù)返回值數(shù)據(jù)類型*> <函數(shù)名>(形參表)
{
......
return p; //p是一個(gè)指針變量.
}
思考題目 : 下面哪個(gè)函數(shù)能使調(diào)用函數(shù)讀到"hello world!"這個(gè)字符串.
char *fun() char *fun1()
{ {
char arr[] = "hello world!"; char *p = "hello world!";
return arr; return p;
} }
結(jié)果可以發(fā)現(xiàn)char *fun1()返回了字符串"hello world!",但是char fun();沒有返回"hello world!",這是為什么呢???還記得之前說的靜態(tài)儲(chǔ)存區(qū)嘛???
?
靜態(tài)儲(chǔ)存區(qū)存放常亮而"hello world!"便是一個(gè)常亮儲(chǔ)存在靜態(tài)儲(chǔ)存區(qū)中,然而char arr[];這是普通全局局部變量,所以fun()返回的是一個(gè)野指針因?yàn)閒un()程序結(jié)束后就自行釋放內(nèi)存空間,而char *p不同這不是一個(gè)普通變量這是一個(gè)指向常量首地址的指針,所以它在靜態(tài)儲(chǔ)存區(qū)中,所以然后可以返回值啦。因?yàn)槌绦驔]結(jié)束,靜態(tài)儲(chǔ)存區(qū)中內(nèi)存空間還沒有沒有釋放。
5.函數(shù)指針 :?指針指向的是函數(shù)的首地址,也就是用來存放函數(shù)入口地址的指針.
函數(shù)指針的定義 :?<函數(shù)返回值數(shù)據(jù)類型> (*函數(shù)指針變量名)(函數(shù)形參表);
對(duì)應(yīng)的函數(shù)的定義 :?<函數(shù)返回值數(shù)據(jù)類型> <函數(shù)名>(函數(shù)形參表)
{
......
return 函數(shù)返回值;
}
函數(shù)指針使用方法 :?將函數(shù)名(實(shí)際就是函數(shù)的入口地址)賦值給對(duì)應(yīng)的函數(shù)指針,通過對(duì)函數(shù)指針的使用即可實(shí)現(xiàn)對(duì)對(duì)應(yīng)函數(shù)的調(diào)用.
6.函數(shù)特殊參數(shù)的傳遞:
函數(shù)的形參是指針:
當(dāng)指針作為實(shí)參傳遞給函數(shù)時(shí),對(duì)指針進(jìn)行解引用會(huì)直接改變指針指向的存儲(chǔ)空間中的數(shù)據(jù).
當(dāng)數(shù)組作為實(shí)參傳遞給函數(shù)時(shí),實(shí)際傳遞的是同級(jí)別的指針.
看到這各位同學(xué)是否對(duì)C語言感興趣了呢???小編這里為大家搜集了一份C/C++學(xué)習(xí)資料,如果有興趣的同學(xué)可以進(jìn)學(xué)習(xí)群:前面八七三,中間五二一,后面八零三。連起來就可進(jìn)群然后免費(fèi)領(lǐng)取一份學(xué)習(xí)資料哦!!!!希望大家在C的道路上越走越遠(yuǎn)!!
總結(jié)
以上是生活随笔為你收集整理的服务器经常崩溃??让我们来看看简单的内存知识:C语言——内存管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HyperLPR Python3车牌识别
- 下一篇: jenkins用ssh agent插件在