c基礎之記憶體管理

2021-10-09 03:01:18 字數 1374 閱讀 4708

一、作用域

全域性變數和區域性變數

靜態全域性和區域性變數 總結

型別作用域

生命週期

區域性變數 int a =10

從變數定義到函式結束

區域性變數建立到函式結束

全域性變數 int a =10

整個專案檔案

程式建立到程式結束

static 區域性變數 int a =10

從變數定義到函式結束

程式建立到程式結束

static 全域性變數 int a =10

當前檔案

程式建立到程式結束

static void func( )

當前檔案

程式建立到程式結束

void func( )

整個專案檔案

程式建立到程式結束

二、記憶體布局

記憶體四區模型

棧區:變數、陣列、結構體、指標、列舉、函式形參、常量(c語言存在棧區,c++存在資料區)。

死迴圈不會佔滿記憶體,但是會佔滿cpu;遞迴會導致程式崩潰,棧溢位al

lo

cmalloc

malloc

和 ne

wnew

new 建立的

資料儲存範圍

**區(記憶體低位址)

資料區堆區

棧區(記憶體高位址)

部分公用

部分公用

堆大小與物理記憶體有關

不是公用,但是可以被訪問,向下生長

字串空間操作

char *p = " hello world";//字串常量,不能被修改,資料區

p[1] = "e";//這種初始化的字串不能進行修改

記憶體操作函式

記憶體重置函式:

memset(目標(需要操作的記憶體首位址,可以是棧區也可以是堆區),0,值,位元組大小);//將一塊記憶體重置為0。一般值都取0,別的容易出錯,你可以試試1,會發現出來的不是列印出來不是1
拷貝函式

memcpy(dst,src,位元組大小);//將src所指的記憶體內容前n個位元組拷貝到dst所指記憶體,注意拷貝的記憶體資料和目標不要重合

memmove()//引數和memcpy一樣,即使需要拷貝空間重合,這個函式也可以操作,但是效率比memcpy低

比較大小函式

memcmp(const void* s1, const void* s2, n);//比較s1,s2記憶體首位址開始前n個位元組,相等為0;大於》0;小於<0

c 之記憶體管理

c 使用3 種不同解決方案儲存資料,區別是資料保留在記憶體中的時間 兩種儲存持續性為自動 自動變數和暫存器變數 register 沒有記憶體位址 堆疊 在函式外定義的變數和使用關鍵字static定義的變數的儲存持續性都為靜態.分為 3 外部鏈結性,內部鏈結性和無鏈結性 所有靜態變數都有下面的兩個初始...

C 之記憶體管理

malloc calloc realloc 上述三種方式是使用者在堆上開闢空間的辦法,用完後必須用free釋放,否則會造成記憶體洩露。值得一提的是實際開闢的記憶體比申請的空間大 前面多申請32個位元組,後面多申請4個位元組。具體原因這裡就不再闡述,詳情見c語言動態分配記憶體 c語言記憶體管理方式在c...

php之記憶體管理基礎

用 c 語言程式設計時,開發者要手工地進行記憶體管理。因為 php 經常用作 web 伺服器的模組,記憶體管理與預防記憶體洩漏緊密關聯。此外要知道 php 可能用於執行緒環境中,這意味著全域性變數可能導致競爭狀況。有關執行緒內全域性資料處理的資訊請參見作為執行緒隔離設施的 執行緒安全的資源管理器。此...