内存编程 c语言 c,C语言编程入门之内存管理
本篇教程探討了C語言編程入門之內存管理,希望閱讀本篇文章以后大家有所收獲,幫助大家對相關內容的理解更加深入。
<
自動變量與靜態(tài)變量
auto自動變量
auto是默認的關鍵字,如實際中int?a,實際為auto?int?a,{}內部的都是auto變量,不用為此類變量申請或者釋放空間,它都是自動完成的。
register?變量
例:register?int?a?=?0;
要使用register變量必須使用此關鍵字。
static?靜態(tài)變量
內存位置在程序執(zhí)行期間一直不改變,一個代碼的內部靜態(tài)變量只能被這個代碼塊內部訪問,函數(shù)里使用加載到內存時只會初始化一次,每次訪問該函數(shù)時不會再初始化。
例:static?int?b?=?0;
全局變量與靜態(tài)變量
全局變量的存儲方式與靜態(tài)變量相同,可以被多個文件訪問,在{}之外的變量。
例:
1?????//main.c
2
3?????int?a?=?0;
4
5?????Void?main{}
6
7????//?main1.c
8
9?????extern?int?a;
10
11??????Test(){
12??????a…….}
靜態(tài)全局變量:只能在定義它的文件內部訪問,在其它文件外部是不可以被訪問的。
對于函數(shù)在存在靜態(tài)函數(shù),表示該函數(shù)也只能在文件內部訪問,不可以在文件外部訪問。如果一個代碼塊之外的函數(shù)或者變量,C語言都默認是全局的,可以在其它文件被訪問,除非有關鍵字static,靜態(tài)函數(shù)始終在代碼區(qū),static只表示它對外部是否可見。
例:static?void?test()
內存布局
代碼區(qū)
程序被操作系統(tǒng)加載到內存的時候,所有的可執(zhí)行代碼都被加載到代碼區(qū),也叫代碼段,這塊內存在運行期間是不可以被修改的,只可以被執(zhí)行。
靜態(tài)區(qū)
所有的靜態(tài)變量和全局變量都被放到了靜態(tài)區(qū),程序退出的時候消失,在運行期間都占用內存。
棧區(qū)
所有的自動變量,函數(shù)的形參、返回值都是自動放入棧中,當一個變量超出其作用域時,自動從棧中彈出,不同系統(tǒng)的棧大小是不同的,windows操作系統(tǒng)是棧大小是可以設置的。C語言的形參是從左到右入棧的。
堆區(qū)
堆是一個大容器,它的容量遠遠大于棧,操作也更加復雜。堆中分配的內存不會自動釋放,需要用free手動釋放。一個程序的棧大小是有限的,?一個數(shù)組太大有可能導致棧溢出,不要在棧里面定義太大的數(shù)組。如果使用一個特別大的數(shù)組,那么使用堆而不是棧;如果一個數(shù)組在定義時不確定大小,那么適合使用堆,不適用棧。Malloc如果分配內存不釋放,就會造成內存泄漏。Windows操作系統(tǒng)堆每次分配的空間是4k,4K為一頁,優(yōu)點不用頻繁調度資源,缺點是可能浪費了內存。
void?*malloc(int?size_t);
例:char*?=malloc(10);
Malloc分配空間的初始值是不固定的。
函數(shù)返回一個指針
1?//例1:
2?int?*test(){
3??????Int?*p?=?malloc(1*sizeof(int));//函數(shù)不能直接返回一個auto類型的地址
4??????*p?=?10;
5??????Return?p;
6????}
7?//?例2:
8?const?char?*test(){
9????????Const?char?*s?=?“hello”;
10????????Return?s;//意思是將s指向一個常量地址,常量在程序運行期間一直都是有效的。常量區(qū)和靜態(tài)區(qū)是有效的,程序運行期間一直有效,但是常量區(qū)是只讀的空間。
11?}
12
13?//例3:
14?const?char?*test(){
15?????????Return“hello?world”;
16?}
堆空間實現(xiàn)動態(tài)大小變化的字符數(shù)組
1?????//例:
2??????????char?a[]?=?“asfsb”;
3
4??????????char?b[]?=?“jhansdnfsdg”
5
6??????????char?*p?=?malloc(strlen(a)+strlen(b)+1);
7
8??????????strcpy(p,a);
9
10??????????strcat(p,b);
calloc與realloc的使用
Void?*calloc(size_t?nmemb,?size_t?size)
Malloc的參數(shù)是指定分配的大小,單位是字節(jié)。
Calloc第一個參數(shù)是指定單位的數(shù)量,第二個參數(shù)指定一個單位的大小。
例:用malloc分配10個int
Int?*p?=?malloc(10*sizeof(int));
用calloc分配10個int
Int?*p?=?malloc(10,sizeof(int));
以上兩種寫法分配堆空間的大小是一樣的,malloc只負責分配空間大小,用memset負責清空;Calloc負責分配空間大小,同時負責將空間分配。
Void?*realloc(void?*ptr,?size_t?size)
Realloc在已分配的空間基礎上,重新擴大或縮小這塊空間。用realloc分配的空間也不會將新改變的空間清空。
通過指針形參分配內存的說明
//例:
void?test(char?*s){
s?=calloc(10,1);
strcpy(s,”hello”);
}//錯誤
void?test(char?**s){
*s?=calloc(10,1);
strcpy(*s,”hello”);
}//正確
當你想內部給形參分配空間時,形參一定是個二級指針。
本文由職坐標整理發(fā)布,學習更多的相關知識,請關注職坐標IT知識庫!
總結
以上是生活随笔為你收集整理的内存编程 c语言 c,C语言编程入门之内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 希尔伯特曲线的绘制c语言,用四叉树和希尔
- 下一篇: C语言对p1口取反,单片机c语言编程基础