日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内存编程 c语言 c,C语言编程入门之内存管理

發布時間:2024/10/14 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存编程 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语言编程入门之内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。