記憶體位址分配

2021-04-28 22:43:26 字數 1621 閱讀 8669

inti=1

;intj=

1;cout

<<&

i<<

endl

<<&

j<<

endl;//

2  函式引數列表的存放方式是,先對最右邊的形參分配位址,後對最左邊的形參分配位址。

3 little-endian模式的cpu對運算元的存放方式是從低位元組到高位元組的

0x1234的存放方式入下:

0x4000  0x34

0x4001  0x12 

big-endian模式的cpu對運算元的存放方式是從高位元組到低位元組的

0x1234的存放方式入下:

0x4000 0x12

0x4001 0x34

聯合體union的存放順序是所有成員都從低位址開始存放。

4  乙個變數的位址是由它所佔記憶體空間中的最低位位址表示的。

0x4000  0x34

0x4001  0x12

0x1234 的位址位0x4000

5  堆疊的分配方式是從高記憶體位址向低記憶體位址分配的。

6 char*p

=(char

*)malloc(1);

//為指標p分配一塊記憶體

free(p);

//釋放p所指向的記憶體

free(p);

//error,因為p所指向的記憶體已經釋放掉,再次釋放原來的記憶體區域將會引起錯誤操作p=

0;//將0賦給指標p

free(p);

free(p);

//ok,對乙個空指標,可以多次釋放

char*p

=(char

*)malloc(0);

//p!=null,多次釋放p也會引起錯誤

7 calloc和realloc

void *calloc(size_t num_elements,size_t element_size);

calloc也用於分配記憶體,malloc與calloc的主要區別是

1 後者在返回指向記憶體的指標之前把它初始化為0

2 calloc的引數包括所需元素的數量和每個元素的位元組數,根據這些值,能夠計算出總共需要分配的記憶體

void realloc(void *ptr,size_t new_size);

realloc用於修改乙個原先已經分配記憶體塊的大小,使用這個函式,你可以使一塊記憶體擴大或縮小。如果它用於擴大乙個記憶體塊,那麼這塊記憶體原來的內容依舊保留,新增加的記憶體新增到原來記憶體塊的後面,新記憶體並未以任何方式初始化。如果它用於縮小一塊記憶體,該記憶體塊尾部的部分記憶體被拿掉,剩餘部分記憶體的原先記憶體依舊保留。

如果原先的記憶體塊無法改變大小,realloc將分配另一塊正確大小的記憶體,並把原來記憶體的內容複製到新的塊上,因此,在使用realloc之後,你將不能再使用指向舊記憶體的指標,而是應該改用realloc返回的新指標

如果realloc函式的第乙個引數是null,那麼它的行為和malloc是一樣的。

8  在使用動態記憶體分配的過程中,常常會遇到許多錯誤:

1、對null指標進行解引用

2、對分配的記憶體進行操作時越過邊界

3、釋放並非動態分配皮的記憶體

4、試圖釋放一塊動態分配的記憶體的一部分

5、一塊動態記憶體被釋放後繼續使用

C 記憶體位址分配簡介

1 棧中的變數,其記憶體位址是從高位址到低位址進行分配的 int i 1 int j 1 cout i float pf new float 1.1 cout 2 函式引數列表的存放方式是,先對最右邊的形參分配位址,後對最左邊的形參分配位址。3 little endian模式的cpu對運算元的存放方...

記憶體位址空間與分配

在32計算機中,它的最大記憶體容量是2 32次方 4個gb大小 它是由無符號整形從0 4gb順序構成。0位址對應乙個儲存單元 8bit 1位址也對應乙個儲存單元 8bit 以此類推。如果乙個資料對應的位址是0 3位址,那麼它佔3個儲存單元,也就是3個位元組。由於32位微機的位址匯流排寬度為32位,所...

C 記憶體位址分配與劃分

第一部分c 記憶體位址分配簡介 int i 1 int j 1 cout 2函式引數列表的存放方式是,先對最右邊的形參分配位址,後對最左邊的形參分配位址。3 little endian模式的cpu對運算元的存放方式是從低位元組到高位元組的 0x1234的存放方式入下 0x4000 0x34 0x40...