今天在做題目的時候碰到乙個很奇怪的現象。先看**:
我在定義的時候定義的是a[100],其實是從a[0]到a[99]。執行這個程式的結果是
輸入123
輸出348
這個48正是0的ascii值,這個時候問題就暴露出來了。那麼為什麼len的值會發生改變呢?
其實想要回答這個問題,必須先搞清楚變數在記憶體中的分配方式。在main函式裡面定義的變數是存放在棧中的(其實這種說法也不是很準確,還跟型別有關,比如常量的話就不是這種情況了)。所以未初始化定義的變數是按照先後順序依次存入堆裡,這裡可以用指標檢視具體變數的位址,這樣可以更加清楚的看到記憶體的連續分配情況。(注意乙個整形佔4個位元組,而乙個字元佔1個位元組)。
值得說明的是,如果定義的是全域性變數,這個時候記憶體使用的是堆的儲存方式,這個時候記憶體分配的空間不再連續,而是類似於鍊錶的形式。
指標變數在記憶體中佔 C語言中的指標變數
我想大家應該都知道,指標是c語言的靈魂,我的這種說法應該不是很過分,因為在c語言中,指標真的很重要。指標很強大,並且具有很強的靈活性。指標變數為什麼都是4個位元組的?因為我麼通常使用的都是32位的計算機,記憶體位址都是32位的整數,而指標變數的實質就是記憶體位址。什麼是指標變數?存放位址的變數成為指...
C語言在記憶體中的分布
2019獨角獸企業重金招聘python工程師標準 先認識記憶體中的幾個區,下面的區都在記憶體中,意味著掉電會丟失。但是這不意味著記憶體條裡面真的是這樣,包括作業系統的分頁都只是對記憶體的一種管理方式,或者說是虛擬的邏輯管理。堆區和棧區屬於動態區域,其他的屬於靜態區域,為什麼這麼說?來看看他們生成的過...
陣列在記憶體中是連續存放的嗎
用棧宣告的時候很明顯,都是連續的。在堆上的時候,由於是分批次分配記憶體 首先new出或malloc多少行,然後每一行再分別new 因此其存放是平行的幾條連續儲存,每一行是連續的,行與行之間並不連續。為此,我們嘗試建立乙個2x4的二維矩陣如下 a b c d e f g h 列印其位址來證明。如下,為...