此篇觀念為錯誤觀念 請勿參考
※ 引述《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就是印出多少 相同的道理
有錯麻煩指正...我是自己看書沒人可以問是不是這樣思考是正解...
--
※ 引述《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