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

Isabella avatar
By Isabella
at 2014-03-31T00:02

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就是印出多少 相同的道理

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

--
Tags: 考試

All Comments

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

程式語言 96交通升資

Kumar avatar
By Kumar
at 2014-03-30T23:34
[考題] 國考歷屆考題與考題觀念討論(書裡看到的選這個)請附上想法、出處 int *f(int x) { int y; y = x + 10; return andamp;y; } int g(int y) { int x; ...

台中大東海法緒許老師共預計上幾堂?

Audriana avatar
By Audriana
at 2014-03-30T23:16
我朋友預計看今年度大東海台中班的法緒DVD 是許老師上課的 有台中班的朋友可以幫忙看一下課表嗎 幫我看看今年預計共上幾堂 最後一堂法緒的日期是哪一天 感謝!! -- hi~ 心情不好嗎? - ...

五月關島考試

Madame avatar
By Madame
at 2014-03-30T21:32
哈囉 :) 原PO預計今年五月中左右要到關島考試 預算依旅行社報價 不過我想應該不會超過兩萬 原PO是女生 希望能徵女生一起share團費 考完試也可以一起到處逛逛 歡迎站內信聯絡 謝謝 - ...

民訴家事事件法

Kyle avatar
By Kyle
at 2014-03-30T19:25
[課業] 國考課業相關問題,非歷屆考題的討論,如學理觀念的釐清。 家事事件法 考司律同學有推薦的書或講義嗎 有礙時間及分數比例 不會太厚投資報酬率高的書嗎?? - ...

行政罰法問題

Xanthe avatar
By Xanthe
at 2014-03-30T18:06
※ 引述《sherry131 (SHERRY)》之銘言: : 想請問一下 : 大法官釋字第275號 : 人民違反法律上之義務而應受行政罰之行為,法律無特別規定時, : 雖不以出於故意為必要,仍須以過失為其責任條件。 : 這句看不太懂。 : 行政罰法第7條之規定 : 違反行政法上義務之行為非出於故意或過失者,不 ...