程式語言 96交通升資 - 考試

Table of Contents

此篇觀念為錯誤觀念 請勿參考

※ 引述《okstephen1 (ㄌㄩㄝ)》之銘言:
: [考題] 國考歷屆考題與考題觀念討論(書裡看到的選這個)請附上想法、出處
: int *f(int x)
: {
: int y;
: y = x + 10;
: return &y;
: }
: int g(int y)
: {
: int x;
: x = y – 10;
: return x;
: }
: void main( )
: {
: int *x, y;
: x = f(10);
: y = g(*x);
: printf(“%d %d\n”, *x, y);
: }


活動記錄一開始是Main

local y
main local x

==>執行函數f

dynamic link(指到main)
return address(return to main)
funtion value(指到local y的位址)
local x 10
f local y 20


local x
main local y

==>f返回main後



dynamic link(指到main)
return address(return to main)
funtion value(指到local y的位址)
local x 10
f local y 20 紅色部分因函數執行結束已釋放


local x 指到f執行時local x的address 也就是*x=10
main local y

==>執行函數g


dynamic link(指到main)
return address(return to main)
funtion value 10
local y 20
g local x 10


local x 此時指到g的local x(也是f執行時local x的address) 也就是*x=10
main local y

執行結束後return 10給Main中的y

由於兩個分別獨立且分別呼叫的函式 所以他們的參數和區域變數會共用相同位址

也就是函數f的參數x跟函數g的參數y用相同記憶體(中央堆疊)

函數f的區域變數y跟函數g的區域變數x用相同記憶體

因此當函數f執行完時 main中的x指到一塊記憶體其內容為10

且此記憶體後來又給了函數g中的區域變數x使用

也就是當執行函數g時 main中的x是指到函數g中的區域變數x

所以當函數g中把區域變數x改成10時

主程式的main的x指向的記憶體也會被改成10(同一塊)


我自己剛看這題也是看不懂 想很久

後來自己跑程式就了解了

以下程式

void A()
{
int a=10; //如果你改成int *a=new int(10); 那b印出來就是亂數了
//因為a就變成指到堆積區(heap)而不是中央堆疊(stack)的記憶體了
}

void B()
{
int b;
cout<<b;
}

int main()
{
A();
B();
}

結果會印出10 你把A中的a改成多少 b就是印出多少 相同的道理

有錯麻煩指正...我是自己看書沒人可以問是不是這樣思考是正解...

--

All Comments

Margaret avatarMargaret2014-04-04
嗯,我好意外...你的程式還真的可以跑xdddd
Isla avatarIsla2014-04-07
不過我剛剛測了一下,我認為第一次f()結束時main裡面*x
Andy avatarAndy2014-04-08
會是20,f()的y跟g()的x都是函數第一個宣告的LV,會用相
Madame avatarMadame2014-04-11
同位址,所以main中的x也是用跟上面兩個一樣的位址
Donna avatarDonna2014-04-15
你的程式如果a=10前面再宣告隨便一個LV就會印出那個值
Michael avatarMichael2014-04-19
然後我不負責任發言..這已經超乎我的想像了..求高手...
Elma avatarElma2014-04-20
這就是你的想像阿 共用相同記憶體位址 我的程式跟這個
Carol avatarCarol2014-04-25
題目是一樣的道理 只是我把他簡化了
Agatha avatarAgatha2014-04-25
你說a=10前面再宣告一個區域變數 那就變成此區域變數和
B中的b共用相同記憶體位址
Delia avatarDelia2014-04-30
嗯嗯,不過最近才上PL的課,都是說LV記憶體用完會被釋放
Erin avatarErin2014-04-30
所以這種題目如果真的出來還是要寫...
Megan avatarMegan2014-05-01
後來才想到釋放應該是指對副程式而言的確已釋放 即副程式
Lucy avatarLucy2014-05-05
不在擁有中央堆疊的記憶體空間 但中央堆疊的記憶體內容看
來並不會被清掉
Faithe avatarFaithe2014-05-05
int *a=new int(10); 這一行是指到stack區域嗎??
Wallis avatarWallis2014-05-05
這樣的話 我理解成 Y就變成全域變數了??是這樣嗎qq
Thomas avatarThomas2014-05-08
指到堆積區(heap) 不是堆疊(stack)
跟全域變數完全沒關係
James avatarJames2014-05-12
那就是等全部函式執行完 只到heap中的變數全部歸還??
那函式歸還後變數值會回到main??
Charlie avatarCharlie2014-05-15
耶 我看不太懂你的意思 變數依照記憶體繫結方式分成好幾
Odelette avatarOdelette2014-05-17
種 靜態繫結也就是全域變數或函式中的靜態變數會放在固定
Oliver avatarOliver2014-05-18
區;stack-dynamic variable也就是區域變數跟參數會放在
堆疊區(中央堆疊);heap-dynamic variable也就是new指令
Sandy avatarSandy2014-05-22
在執行時動態分配的會放在heap區 此題主要是考函式呼叫
故都會放在stack(中央堆疊的位置)
Connor avatarConnor2014-05-25
根據執行結果 當函式執行結束 其與記憶體繫結結束
但值仍然會保留在stack(中央堆疊)的位置 此時如果你有指
Lydia avatarLydia2014-05-28
向他依舊可以存取到 但我不知道這算不算前面版友說的懸疑
指標.. 畢竟他是指到中央堆疊 不算指到作業系統的記憶體
Xanthe avatarXanthe2014-06-01
我的程式得註解只是我自己跑程式的心得 各位可以自己跑看
看 甚至可以印出各變數的記憶體位置來比較看看 會更清楚
Enid avatarEnid2014-06-03
謝謝sun大的指教 非常清楚
推薦大家印出記憶體位置就一目瞭然
Elvira avatarElvira2014-06-06
我是覺得應該是釋放的記憶體未被分配使用 所以可讀出是10
Faithe avatarFaithe2014-06-08
不然照理論說 應該會錯誤發生 因為活動紀錄被釋放
Genevieve avatarGenevieve2014-06-12
應該也算懸疑指標 因為指向不具意義的記憶體
Edith avatarEdith2014-06-13
多謝K大,所以說中央堆疊仍算是系統的記憶體囉?
Cara avatarCara2014-06-18
我想是吧 函式執行時 系統從堆疊分配記憶體空間給函式
Ida avatarIda2014-06-18
建立活動紀錄 執行完再釋放 印象中好像也有遇過類似題目
Rebecca avatarRebecca2014-06-21
非常感謝您!!