用棧宣告的時候很明顯,都是連續的。
在堆上的時候,由於是分批次分配記憶體(首先new出或malloc多少行,然後每一行再分別new),因此其存放是平行的幾條連續儲存,每一行是連續的,行與行之間並不連續。為此,我們嘗試建立乙個2x4的二維矩陣如下
a b c d
e f g h
列印其位址來證明。**如下,為了直觀,略去了一些安全檢查。
#include
#include
#include
using namespace std;
#ifdef __cplusplus
extern
"c";
#endif
void
c_stack()
,};for
(int i =
0; i <
2; i++
)printf
("\n");
}printf
("********************=\n\n");
}void
c_malloc()
printf
("\n");
}for
(int i =
0; i <
2; i++
)free
(str[i]);
free
(str)
;printf
("********************\n\n");
}void
cxx_stack()
,};for
(int i =
0; i <
2; i++
) cout<} cout<<
"********************=="
<}void
cxx_new()
cout<}for
(int i =
0; i <
2; i++
) delete [
]str[i]
; delete str;
cout<<
"********************"
<}int
main()
編譯執行:
admin@ubuntu
:~ $ g++
newadmin@ubuntu:==
==== c stack ==
====
[a]0x7fffa8e11cb0
[b]0x7fffa8e11cb1
[c]0x7fffa8e11cb2
[d]0x7fffa8e11cb3
[e]0x7fffa8e11cb4
[f]0x7fffa8e11cb5
[g]0x7fffa8e11cb6
[h]0x7fffa8e11cb7
====
====
====
====
*****==
==== c malloc ==
====
[a]0xec6030
[b]0xec6031
[c]0xec6032
[d]0xec6033
[e]0xec6050
[f]0xec6051
[g]0xec6052
[h]0xec6053
====
====
====
====
====
====
==== cpp stack ==
====
[a]0x7fffa8e11ca0
[b]0x7fffa8e11ca1
[c]0x7fffa8e11ca2
[d]0x7fffa8e11ca3
[e]0x7fffa8e11ca4
[f]0x7fffa8e11ca5
[g]0x7fffa8e11ca6
[h]0x7fffa8e11ca7
====
====
====
====
*****==
====
== cpp new
====
==[a]
0xec6050
[b]0xec6051
[c]0xec6052
[d]0xec6053
[e]0xec6030
[f]0xec6031
[g]0xec6032
[h]0xec6033
====
====
====
====
====
=
關於陣列在記憶體中的存放形式
char a 3 3 sizeof a 結果是9 9這個結果一直認為是 理所當然 但是當自己實現乙個二維陣列時,最簡單的方式就是 char test char malloc sizeof char row size int i 0 for ichar malloc sizeof char col s...
bmp在記憶體中的存放
bmp 儲存影象 每張圖按大小來儲存,即影象的長寬畫素大小。如果一張的畫素是 240x320,則此影象在記憶體的存放是乙個 240x320的陣列,每個陣列的元素是int整形 整數占用4個byte 數位相機中所謂的支援500w畫素就是這個意思,代表它能處理多大的圖形色彩資訊的能力,畫素越高,需要處理時...
資料在記憶體中的存放
在計算機系統中,執行的應用程式的資料都是儲存在記憶體之中 不同型別的資料,儲存的記憶體區域不同,其中包括 1 棧區 stack 由編譯器自動分配並釋放,一般存放函式的引數值,區域性變數等 2 堆區 heap 由程式設計師分配和釋放,如果程式設計師不釋放,程式結束時,可能會由作業系統 3 暫存器區 用...