基礎C語言知識串串香6 記憶體大話題

2021-10-04 05:10:20 字數 3695 閱讀 6279

1.0、記憶體就是程式的立足之地,體現記憶體重要性。

1.1、記憶體理解:

記憶體物理看是有很多個bank(就是行列陣式的儲存晶元),每乙個bank的列就是位寬,每一行就是words,則儲存單元數量=行數(words)×列數(位寬)×bank的數量;通常也用m×w的方式來表示晶元的容量(或者說是晶元的規格/組織結構)。

m是以位寬為單位的總容量,單位是兆,w代表位寬,單位是bit。計算出來的晶元容量也是以bit為單位,但使用者可以採用除以8的方法換算為位元組(byte)。比如8m×8,這是乙個8bit位寬晶元,有8m個儲存單元,總容量是64mbit(8mb)。

1.2、c語言中其實沒有bool型別:以0表示假,非0表示真,則在記憶體儲存是以int型存放的。如果想要表示真假,可以用int/char型做替換,在c++中就有boolx=true/false;

1.3、記憶體對齊:記憶體對齊(提高訪問效率速度,編譯器一般預設是4位元組對齊)

1.4、char/int/short/long/float/double型:放在記憶體的長度和解析作用。(int*)0,使0位址指向乙個int型。又比如0000111010101可以解析成int型也可以解析成float型。

1.5、linux核心是物件導向的,而c語言是面向過程的,但可以用結構體內嵌指標變成物件導向。

structstudent
1.6、棧的理解:(1)執行時自動分配&自動**:棧是自動管理的,程式設計師不需要手工干預。方便簡單。(表現在彙編**,編譯時,會自動編譯成彙編碼實現函式呼叫完立即改變棧頂)

(3)髒記憶體:棧記憶體由於反覆使用,每次使用後程式不會去清理,因此分配到時保留原來的值。

(4)臨時性:(函式不能返回棧變數的指標,因為這個空間是臨時的)

(5)棧會溢位:因為作業系統事先給定了棧的大小,如果在函式中無窮盡的分配棧記憶體總能用完。棧的操作(怎麼出棧怎麼入棧)是由具體硬體來干預,程式設計師只要明白原理就可以了,但是要給相應的棧暫存器賦值。當呼叫函式時,變數會自動放在棧中(入棧)當函式呼叫完後,棧會自動出棧.

(6)棧的"發展"有四種情況,滿增棧,滿減棧,空增棧,空減棧,至於是那種要根據編譯器決定,而s5pv21是滿減棧。

1.7、堆的理解:

(1)作業系統堆管理器管理:堆管理器是作業系統的乙個模組,堆管理記憶體分配靈活,按需分配。

(2)大塊記憶體:堆記憶體管理者總量很大的作業系統記憶體塊,各程序可以按需申請使用,使用完釋放。

(3)髒記憶體:堆記憶體也是反覆使用的,而且使用者用完釋放前不會清除,因此也是髒的。

(4)臨時性:堆記憶體只在malloc和free之間屬於我這個程序,而可以訪問。在malloc之前和free之後都不能再訪問,否則會有不可預料的後果。

申請一段記憶體,可以是:

malloc( 10*sizeof(int) );
原型:

void* malloc( size_t size );

//指標函式size_t是巨集定義int都是便於可移植性,返回乙個記憶體位址,void*可以看出,希望申請的記憶體用來存放什麼就強制型別什麼。

也可以是:

calloc( 10, sizeof(int) );
原型:

void* calloc( size_t nmemb, size_tsize);//nmemb個單元,每個單元size位元組
也可以是:

void* realloc( void* ptr, size_t size );//改變原來申請的空間的大小的ptr是原來申請記憶體的指標,size是想要重新申請記憶體的大小使用就是*(p+1)=12;*(p+3)=110;
申請失敗返回null,申請成功返回乙個位址,申請之後一定要檢驗(null!=p)用完一定要free(p);釋放後不是不能用,是不應該使用了。可以給它「洗盤子『,p=null;

其實申請的記憶體並不能真正改變大小,原理是先重新申請一段記憶體,然後把原來申請的記憶體上的內容複製到新的記憶體上,然後釋放掉原來的記憶體,返回新的指標。

(6)在申請記憶體時,malloc(0)其實也是成功的,因為系統規定少於一定數目的大小,都申請規定的大小,如在win32系統下申請少於32位元組的位址,最後申請到的空間是32位元組。

1.8、記憶體裡的資料

(1)**段:存放**二進位制、常量(char*p="linux",則」linux「存放在**段,是不可更改的)

(2)資料段:存放非0全域性變數、靜態區域性變數(區域性只屬於函式的,不是整個程式的)

(3)bss:存放為0的全域性變數/為0的靜態區域性變數、存放未初始化全域性變數/靜態區域性變數

注意:constinta=9;有兩種存放方式:第一種確實存放在**段,讓a不能修改,第二種是仍然存放在資料段中,讓編譯器來判斷,如果有改變的**就會報錯。至於那種,是不確定的,像微控制器就屬於第一種。

1.9、程式在記憶體中的分布

《1》乙個原始檔實際上是以段為單位編譯成連線成可執行檔案(a.out);這個可執行檔案總的說是分為資料段,**段,自定義段。資料段還可以細分成.bbs段。而雜段會在執行的時候拿掉。所以a.out分為雜段,資料段(存放的是非0全域性變數).bbs段,**段。

《2》記憶體實際上被劃分了兩大區域,乙個是系統區域,另乙個是使用者區域,而每乙個區域又被劃分成了幾個小區域,有堆,棧,**區,.bbs區,資料區(存放的是非0全域性變數)。

《3》對於有作業系統而言,當我們在執行a.out可執行檔案時,執行這個檔案的那套程式會幫我們把雜段清掉,然後把相應的段載入到記憶體對應的段。對於裸機程式而言,我們是使用一套工具將a.elf的可執行程式給清掉了所有段的符號資訊,把純淨的二進位制做成.bin格式的燒錄檔案。所以我們載入到記憶體的程式是連續的,也就是說**段和資料段、.bbs段都是連續的。當然,棧空間是我們自己設定的。而且在裸機中我們不能使用malloc函式,因為我們使用的只是編譯器、聯結器工具沒有整合庫函式,沒有定義堆空間區。

往期熱文:

基礎c語言知識串串香(1)

基礎c語言知識串串香(2)

基礎c語言知識串串香(3)

基礎c語言知識串串香(4)

基礎c語言知識串串香(5)

**********=我是華麗的分割線**********=

嵌入式linux&arm

或瀏覽器開啟:

基礎C語言知識串串香3 size t型別

c語言標準規定size t是一種無符號整數型別,編譯器可以根據作業系統的不同而用typedef來定義不同的size t型別,即在不同的作業系統上所定義的size t 可能不一樣。例如在32位作業系統上可以將size t定義為unsigned int型別,而在64位作業系統上則可以定義為unsigne...

基礎C語言知識串串香8 指標精髓

其中 p表示輸出乙個指標,就是指標變數 其存放的那個位址 可以理解為輸出乙個位址。3.2 int p1,p2 等同於int p1 int p2 int 其不能改變 因為 是乙個常數。3.3 規範性 在定義指標時,同時賦值為null,在用指標時,先判斷它是不是null。尤其是在malloc申請記憶體使...

基礎C語言知識串串香1 基本資料型別

到c99目前為止,c語言為我們提供了12個相關的資料型別關鍵字來表達各種資料型別。如表所示,k rc提供了7個,c891,c90 新増了2個,c99新増了3個。c的基本資料型別 整型是c語言最基本的資料型別,它以二進位制編碼的方式進行儲存,具體可以包括字元 短整型 整型和長整型等。例如,整數2的二進...