C語言基礎之記憶體

2021-08-14 08:35:07 字數 2103 閱讀 4366

共用體也叫聯合體,可以定義不同資料型別的資料共同占用同一段記憶體空間

共用體的長度

#include 

/* 共用體是一種資料結構。

*/union data

u;int main ()

所以說,功用體只有最大那個變數的長度,各成員解析按照你列印的方式

float型別在解析時,不加取位址,才能正確列印

#include 

int main(void)

a=; printf("%c \n %ld\n",a.u1,a.u2);

return

0;}

列印出的結果為a和97,因為0x61對應字元『a』,0x61輸出97

電腦硬體配置的記憶體是物理器件,程式執行起來是在虛擬記憶體中執行。而虛擬記憶體中又分為不同的段,比如,棧段、堆段、**段(.text) 、roread段、檔案對映區、核心區、資料段、.bss段

有一些關鍵字專門用於描述:變數儲存的地方(記憶體)

1,棧,如:棧上變數儲存關鍵字auto。是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進後出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區

2,堆,堆是用於存放程序執行中被動態分配的記憶體段,malloc+free的那些函式,表示變數在堆空間。

3,**段:通常是指用來存放程式執行**的一塊記憶體區域。函式,char *p=「12345」可能在唯讀段.

4,roread段:const修飾的變數

5,檔案對映區:當你程序開啟乙個檔案,就在記憶體中有了乙個副本,更新或者操作l這個檔案,儲存一下,就儲存在了你的硬碟上。

6,核心區:各自的程序彼此之間,是看不見,獨想你的整個虛擬記憶體。所以,各自的程序裡,都有乙個核心區。

7,data段:通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。例如:1、static修飾的顯式初始化為非0的區域性變數,2、顯式初始化為非0的全域性變數。

8,.bss段:1、static修飾的初始化為0或者不初始化的區域性變數2、初始化為0或者不初始化的全域性變數。(全域性的未初始化變數存在於.bss段中,具體體現為乙個佔位符;全域性的已初始化變數存於.data段)

static:修飾區域性變數每次呼叫時,保留上一次的執行結果

register關鍵字,修飾的變數,盡可能存在暫存器裡。

volatile關鍵字,見memory.c

restrict 專用於修飾指標.

作用域花括號{}裡面的變數,只能在裡定義時,到花括號結束有效。

定義和宣告有時候不會嚴格區分

生命週期

這個變數從誕生到消亡的乙個過程。

1、棧變數:作用域(花括號內,從你定義的那一刻直到花括號結束),函式結束就消亡了,臨時的生命。

2、堆變數: 作用域(花括號內,從你定義的那一刻直到花括號結束),伴隨整個程式,直到程式結束

3、**段:放的是函式,伴隨整個程式

4、唯讀變數:普通變數的作用域,伴隨整個程式。

5、data段變數:作用域:定義時,之後直到程式結束都可以用(1、全域性,2、區域性),伴隨整個程式。

extern專用於宣告。

我們很多很多檔案(.c)就組成乙個工程。linux作業系統,是由2萬多個.c檔案組成.

c語言編譯鏈結過程:所有的.c檔案,編譯成了.o的目標檔案(2進製),彼此是孤立的,接著就是鏈結器,鏈結起來。所有的.o的目標檔案都對應乙個相應的符號。所有的符號進行鏈結。

在os下:裡寫好的可執行檔案,是別人給你寫好了一段對c語言引導作用**,載入到相應的記憶體。位置(位址)無關碼和位置有關碼?

data段和.bss:在你的c語言(巨集替換之前)執行之前,(引導幹的)你的.data段已經被賦值,.bss段被清0.

全域性變數:鏈結屬性是外鏈結(檔案級別),而加了static修飾的全域性變數就變成了,本檔案鏈結屬性(內鏈結)

函式:預設是外鏈結,static修飾的函式變成了內鏈結,只在本檔案起作用。

c基礎之記憶體管理

一 作用域 全域性變數和區域性變數 靜態全域性和區域性變數 總結 型別作用域 生命週期 區域性變數 int a 10 從變數定義到函式結束 區域性變數建立到函式結束 全域性變數 int a 10 整個專案檔案 程式建立到程式結束 static 區域性變數 int a 10 從變數定義到函式結束 程式...

C語言基礎之 記憶體位址分配

一.記憶體劃分 位址由高到低 1.棧區 棧區的資料以棧的形式進行儲存,特點 先進後出 函式體內存放的區域性變數存放在棧區,由系統分配空間和系統釋放.開發人員不需要關心如何為區域性變數分配空間.int a 10 printf p n a 2.堆區由開發人員手動申請,手動釋放,唯一一塊由開發人員操作的區...

C語言篇之記憶體

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