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