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