解釋下面C語言程式中變數地址不變(分屬父子程序)的原理

時間 2022-08-10 01:30:12

1樓:匿名使用者

好問題.

這樣理解:

(1) 對於現代的作業系統來講, 每個程序都有自己的獨立虛擬地址空間, 程序中的地址並不是實際的實體記憶體的地址, 核心會完成從虛擬地址到實體地址的對映. 所以兩個不同程序中的同一虛擬地址, 不一定(這塊我只能用不一定)對映到同一實體記憶體地址.

(2) 對於父子程序而言, 子程序是父程序呼叫fork()後建立出來的拷貝, 理論上二者在虛擬記憶體空間這個角度上看是一樣的, 所以在父程序在fork()前建立的變數, 與fork()後子程序中的同一變數虛擬地址是一樣的.

(3) 對於核心而言, 每次fork()時都建立父程序的完整拷貝, 效率是比較低下的, 所以作業系統會使用copy-on-write(寫時拷貝)機制, 所以在父子程序中一方對某一地址空間寫入之前, 二者實際上是對映到同一實體記憶體地址, 父子一方對某一地址空間進行寫入操作時, 作業系統才實際建立這一部分的拷貝

2樓:

這個問題實際上要看編譯原理。

絕大多數高階語言在定義一個變數的時候,實際上是預留出合適的儲存空間,在經過編譯以後,變數名稱就變成了對應的儲存地址了。在此後所有對該變數的操作實際上都是通過對其地址的操作來完成的。

所以....在本程式段的生命週期內,如果不特意的釋放記憶體,你變數的地址不會發生變化。

但是,如果變數在子程式段中,每一次呼叫子程式,變數都會被重新賦予新的儲存地址。

為了讓你更清楚一點,請看下面的彙編程式:

data segment

d1 db 1

d2 dw 1234h

d3 db 1,2,3,4,5,6

db 7,8,9

...因為彙編程式是最接近機器語言的低階語言,在彙編程式編寫的時候,會有一個data segment,專門來預留儲存空間,這和高階語言定義變數實際上是一回事。

二級C語言,看下面程式

首先k 2,然後你進行一次迴圈後,k自增兩次,變成4,然後執行下面的語句,所以s 1。然後當k 4的時候,s 1,j 4,然後執行內層迴圈,s 1 4,然後j自增等於5,s 5 5,然後j再自增為6,跳出內層迴圈。k自增兩次後等於6,不成立,跳出外層迴圈。然後輸出s的值,s 10.include v...

c語言程式疑惑(找高手幫忙解釋程式)

大頭 1.為什麼要在定義陣列後就直接輸出printf array a n 這個有什麼意義 答 意義就是提示下面輸出的資料是陣列 a 的資料 迴圈執行printf 5d a i j 將陣列 a 的全部內容輸出。2.程式中有兩處for語句巢狀迴圈,為什麼會有兩次?還有就是第一處的for語句巢狀迴圈得出的...

有誰能幫我把下面的C語言程式改成c 程式嗎

c 程式 include using namespace std struct elem void main else cin temp 刪除偶數 tempp head while null tempp else deletep tempp tempp tempp next if 0 deletep...