C語言中記憶體位址是否占用儲存空間呢?

時間 2021-05-30 10:58:48

1樓:xkyzzz

當我們只有下面這個語句的時候

int a=5;

這個時候,變數a也是有乙個記憶體位址的,但是它的記憶體位址是不占用記憶體空間的。

當我們再加下面語句的時候

int *p=&a;

此時,把變數a的位址賦值給了指標p,這個時候a的記憶體位址(p)是要占用儲存空間的。

如果我們沒有申明指向a的指標,那a的記憶體位址是儲存在哪呢?

個人猜測應該是有一種記憶體管理機制,類似陣列那樣,由基位址和偏移可以知道a的位址,因此就不需要去儲存每個變數的位址(實際是每個變數都是有位址的),只需要知道每個變數在記憶體中的偏移就可以知道每個變數的位址,當我們用&取位址的時候,就可以知道變數的位址,再將其賦值給p,此時的p就要占用記憶體位址了。

因此就不會有「假如占用,那麼它又有了自身的位址,自身的位址也得占用空間呀,……。得,無限遞迴了。」這種情況發生了。

2樓:yifan sun

要看具體的情況。基本上有兩種情況,棧變數和堆變數。

棧變數是直接宣告出來的,比如 int i. 那麼 int i 計算機是怎麼處理的呢。編譯器會對乙個函式的棧變數總長度有乙個記錄。

當時呼叫乙個函式的時候,記憶體會分配一段空間儲存你所有宣告的變數。就像大學分宿舍,所有人住到特定的床位上去,而且是一次性分配的。這時候你的床位號本身並不需要有乙個床位。

床位號只是每個人的乙個位置描述。

另外一種是堆變數。也就是你用malloc出來的空間。malloc的空間放在乙個地方,它的指標你肯定需要乙個堆變數來儲存它。

比如int *i = malloc(4). 實際上這裡有兩個變數被創造,乙個是那個真正的int,乙個是那個指標。那個int是堆變數,4位元組,指標是棧變數, 8位元組(64位機)。

這時候這個指標是佔了空間的。但是這個指標的指標又不占用空間,因為這個指標是棧變數。

3樓:天貓Skycat

需要占用的,由作業系統維護的乙個記憶體表。這個是邏輯記憶體表,比實體地址大。而且不只是只有位址,還有對應的有沒有使用的標記。

為什麼會比物理記憶體大呢?想想虛擬記憶體,虛擬記憶體也是需要位址,所以當訪問的位址是的資料是虛擬記憶體上,作業系統會把位址對應的虛擬記憶體從硬碟拷貝到記憶體裡,然後將實體地址和邏輯位址關聯。

這樣子物理記憶體夠存嗎?記憶體表並非是儲存完全的邏輯位址對應實體地址,而且有一定的資料結構。記憶體分頁、分段等概念多少應該聽過吧,系統會將記憶體分塊管理起來。

這就像樹結構一樣,沒使用到的地方是不會占用空間的,當程式執行用到時,才會建立更詳細的記憶體表去維護,所以就夠存啦。

咱不是專門研究作業系統的,只是稍微了解過,用自己所理解的、非專業的詞語表達。o( ̄ε ̄*)

4樓:「已登出」

不占用,因為位址只是計算機對位元組賦予的編號,並一一對應。位址可以說是乙個硬性的"識別符號",不能改變。而記憶體中的位元組內容是可以讀寫的。

以上只是我的個人見解,題主可以參考

c 和c語言中不用專門的動態儲存分配函式就不能實現動態儲存分配了嗎?

魚叉 好像只有gcc可以,cpp標準裡沒這回事。這種還是分在棧空間,不擴棧的話一般就幾M大小,malloc在堆裡可以更大,具體可以查查linux記憶體布局。要是這樣動態分配很容易棧不夠然後core.危險行為,常量長度棧不夠一般編譯期就會報出來。 我在devc 裡試了先定義乙個整型a,然後對a輸入值,...

c語言中對陣列名取位址會發生什麼?

陣列名本質是指標.我個人不建議這樣理解,我也可以說指標本質是整型數,整型數本質是010101.intarr 10 cout arr name endl int 10 長度為10的存有int的陣列 cout arr name endl int 10 指向 長度為10的存有int的陣列 的指標 cout...

在c語言中指標就是可以變化的位址嗎?

僅僅說對了一部分。1 的確,在絕大多數場合,指標是 變化的位址 我們開拓一下思路 變化的位址 的反義 是 不變化的位址 對嗎?沿這個思路,想一想,指標是否可能是 不變化的位址 int const p 指標p能變化嗎? 我認為,不一定 指標不僅負責儲存乙個位址,還負責儲存,它能管轄的記憶體範圍 例如 ...