自學C day13 記憶體管理

2021-10-21 20:28:16 字數 4036 閱讀 9270

定義在函式內部的變數

作用域:從定義位置開始到包裹該變數的第乙個右大括號結束

定義在全域性變數位置

定義語法:在區域性變數定義之前新增static關鍵字

特性:靜態區域性變數只定義一次在全域性位置,通常用來做計數器

作用域:從定義位置開始到包裹該變數的第乙個右大括號結束

就是常說的函式

定義語法:函式原型 + 函式體

**段:.text段。這裡存放的是程式的源**(二進位制形式)

資料段:分為唯讀資料段.rodata、初始化資料段.data、未初始化資料段.bss

stack棧:在其之上開闢棧幀,windows系統中預設大小為1m,可以提公升到10m,linux裡面預設是8m,可以提公升到16m

heap堆:給使用者自定義資料提供空間的,空間約是1.3g+

裡面存放的是初始化為非0的全域性變數和靜態變數

裡面存放的是初始化為0、未初始化的全域性變數和靜態變數。程式載入執行前,會將該段整體賦值為0

裡面存的是常量

容量比較小,由系統自動管理,自動分配,自動釋放

儲存特性是:filo後進先出

空間足夠大,可大可小的內容都放到堆裡面去,因為heap可以認為是無限的空間

是乙個正方形(由於windows系統閉源,所以該模型僅僅是推測),化成了四塊

是乙個長方形,橫向劃分,從下至上是:

.text(唯讀) — .rodata (唯讀)— .data(讀寫) ---- .bss(讀寫) — heap – 標準庫載入的位置–(挨近3g的地方)stack

區域性變數:從變數定義開始,到函式呼叫完成,即函式內部。 --函式內部

全域性變數:從程式啟動開始(早於main函式),到程式終止結束。 --程式執行期間

static區域性變數:程式啟動開始,到程式終止結束。 --程式執行期間

static全域性變數: 程式啟動開始,到程式終止結束。 --程式執行期間

全域性函式:程式啟動開始,到程式終止結束。 --程式執行期間

static函式:程式啟動開始,到程式終止結束。 --程式執行期間

在堆上面用空間的話要先申請,這就要開闢空間,有開闢就有釋放

void *malloc(size_t size) //申請size大小的空間,返回實際申請到的記憶體空間首位址。我們通常拿來當陣列用

void free(void *ptr)

使用heap空間當陣列用時,必須要求空間是連續的

free後的空間不會立即失效,通常將free後的位址要置為空

free的位址必須是malloc申請的位址。否則會報錯。

malloc和free應該成對出現,如果分配的位址必須要變化的話,那就先用乙個tmp來存這個位址,後面去釋放這個tmp

#define _crt_secure_no_warnings

#include

#include

#include

#include

#include

intmain

(void

)//寫資料到malloc空間

for(size_t i =

0; i <

10; i++

)//讀出malloc中的資料

for(size_t i =

0; i <

10; i++

)//不用的話要釋放記憶體

free

(p);

p =null

system

("pause");

return exit_success;

}

申請外層指標:char **p =(char **) malloc(sizeof(char * ) * 5); //強轉成什麼型別都是跟著前面走的

申請內層指標:for(i = 0;i<5;i++)

使用:for(i = 0;i<5;i++)

釋放:先內後外

for(i = 0;i<5;i++)

釋放外層:free§;

這三個函式都是變參函式,即形參中有「…」,最後乙個固定引數通常是格式描述串(包含格式匹配符),函式的引數個數、型別、順序都是由這個固參決定

printf(「hello」)

char buf[1024];

sprintf(buf,「hello」);

file *fp = fopen();

fprintf(檔案指標,格式串)

fprintf(fp,「hello」)

scanf("%d",&m) --從鍵盤接收資料

char str = 「98」

sscanf(str,"%d",&m) --從字串str中接收資料

file *fp = fopen(「abc.c」)

fscanf(fp,"%d",&m) –

#define _crt_secure_no_warnings

#include

#include

#include

#include

#include

intwrite_file()

fprintf

(fp,

"%d%c%d = %d\n",10

,'*',5

,10*5

);fclose

(fp);}

intread_file()

fscanf

(fp,

"%d%c%d = %d\n"

,&a,

&ch,

&b,&c )

;printf

("%d%c%d = %d\n"

, a, ch, b, c)

;fclose

(fp);}

intmain

(void

)

這三組函式都是用來處理文字檔案的

這兩個是用來處理二進位制檔案的

fwrite:寫出資料到檔案中,它有四個引數

參1:待寫出資料的位址

參2:待寫出資料的大小

參3:寫出的個數/次數 --參2 * 參3 =寫出資料的總大小

參4:檔案

返回值:成功:永遠時參3的值;

失敗:返回0

使用技巧:通常將參2傳1,將參3傳實際寫出的位元組數

int ret =

fwrite

(&stu[0]

,1,sizeof

(stu_t)

, fp)

;int ret =

fwrite

(&stu[0]

,1,sizeof

(stu_t)*4

, fp)

;//這是返回四個結構體

typedef

struct student stu_t;

intmain

(void);

file *fp =

fopen

("test03.txt"

,"w");

//開啟檔案if(

!fp)

int ret =

fwrite

(&stu[0]

,1,sizeof

(stu_t)

, fp)

;//返回的是參3的值

if(ret ==0)

printf

("%d\n"

, ret)

;fclose

(fp)

;system

("pause");

return exit_success;

}

fread()函式:從檔案fp中讀出

參1:讀取到的資料儲存的位置

參2:一次讀取的位元組數

參3:讀取的次數 --參2 * 參3 = 讀出的資料總大小

參4:從哪個檔案中讀

返回值:成功的話返回參3的值,通常將參2傳參1,將參3傳要讀出的位元組數

失敗返回0;0同時也能表示讀到檔案結尾

0:讀失敗----feof(fp)

c day 13智慧型指標, 巨集變數,列舉

unique ptr unique ptr是唯一指標,如果有這個指標進行包裝其他的指標,當這個指標變數拷貝的時候會出現錯誤,這是因為這個指標是唯一的,不允許被複製 int main p1 會出現錯誤 shared ptr shared ptr是共享指標,它允許多個指標指向同乙個記憶體,可以被複製,每...

c day13 多型 虛析構 過載重寫重析構

如果不寫virtual關鍵字會是靜態鏈結編譯 includeusing namespace std class a protected private class b protected private class c public a protected private 封裝,封裝突破c函式的概念...

記憶體管理策略!(13)

對於32位程序而言,這個位址空間的大小為4gb。而64位程序則可以到達16eb的位址空間。每個程序都有自己專有的位址空間,當程序中的執行緒執行時,他們只能訪問屬於該程序的記憶體。每個程序的虛擬空間都被劃分成許多分割槽 0x00000000 0x0000ffff是空指標賦值分割槽 0x00010000...