C語言篇之記憶體

2021-08-21 20:11:31 字數 1495 閱讀 3481

記憶體編址、定址和記憶體對齊

記憶體編址是以位元組為單位的,其中int整形和cpu本身的資料位寬是一樣的,如32位cpu int是32位,整數型別當資料型別和記憶體相匹配時才能獲得最好的效能。記憶體的對齊訪問不是邏輯問題而是硬體問題,對齊訪問很配合硬體所以效率會很高,因為非對齊訪問和硬體本身不搭配,所以效率不高,由於相容性問題,一般硬體提供非對齊訪問,但是效率要低很多。

資料型別的本質含義

資料型別的本質含義表示所佔記憶體格仔的長度和解析方法的不同。

3.記憶體管理之棧 stack

棧的特點:1 棧是自動管理的,自動分配、自動**

2 反覆使用

3 髒記憶體

4 臨時性

5 棧會溢位

棧是有大小的,棧記憶體太小怕溢位太大怕浪費記憶體,一定要避免棧的溢位。

區域性變數都是儲存在棧上的。靜態區域性變數在儲存類方面和全域性變數一樣,只是改變了鏈結屬性。

記憶體管理之堆 heap

由作業系統堆管理器管理,堆管理器是作業系統的乙個模組,分配靈活按需分配。

堆的特點:1 大塊記憶體

2 需要程式手動申請和釋放

3 髒記憶體 堆記憶體也是反覆使用的,而且在釋放之前不會清楚,所以堆也是髒的

4 臨時性 堆記憶體只有在malloc和free之間可以訪問,在malloc之前和free之後都不能在訪問。

舉例說明:

需要1000個int型別元素的陣列

第一步:申請和繫結

int *p = (int *)malloc(1000 * sizeof(int));

第二步:檢驗

if(null == p)

第三步:使用申請到的記憶體

第四步:釋放

free(p);

p = null;

謹記:在這個p釋放之前一定不要另外賦值,否則這塊記憶體就丟掉了,這就是所謂的程式吃記憶體也就是記憶體洩漏。

malloc的返回值是void * 型別的,malloc幫我們分配時只分配的記憶體空間,至於這個空間我們用來儲存什麼型別的元素malloc是不關心的,由我們自己來定。

void free(void *ptr) ;

void *malloc(size_t size) ;

void *calloc(size_t nmemb , size_t size) ;//需要nmemb個單元,size個位元組

void *realloc(void *ptr ,size_t size);//改變原來申請的空間的大小。

//申請10個int型別元素的記憶體

(int *) malloc(10 *sizeof(int));

(int *)calloc(10 , sizeof(int));

malloc 返回的是乙個void * 型別的指標,實質上malloc的返回值是堆管理器分配給我們本次申請的那段記憶體空間的首位址。

本博文只是作為自己的乙個筆記,如果能幫助其他人更好,若有疑問歡迎指出,歡迎加qq 1922546282,共同討論與學習。

C 之記憶體洩漏篇

前段時間面試經常被問到記憶體洩漏。今天小總結一下 記憶體洩漏的發生是由於使用者在堆上分配了空間,但卻沒有釋放它。持續的記憶體洩漏最終將導致堆的耗盡,後繼的記憶體分配將會失敗。引發記憶體洩漏的原因是用new分配的記憶體沒有用delete釋放掉。如 可能在onpaint這樣的繪畫視窗的函式中分配了空間,...

C語言基礎之記憶體

共用體也叫聯合體,可以定義不同資料型別的資料共同占用同一段記憶體空間 共用體的長度 include 共用體是一種資料結構。union data u int main 所以說,功用體只有最大那個變數的長度,各成員解析按照你列印的方式 float型別在解析時,不加取位址,才能正確列印 include i...

C語言之記憶體使用

問題 記憶體使用 有人寫了乙個將整數轉換為字串的函式 char itoa int n 如果我呼叫這個函式 char str5 itoa 5 str5會是什麼結果呢?答案分析 答案是不確定,可以確定的是肯定不是我們想要的 5 retbuf定義在函式體中,是乙個區域性變數,它的記憶體空間位於棧 stac...