• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メモリ動的確保に関するAP試験問題)

メモリ動的確保に関するAP試験問題

このQ&Aのポイント
  • H23年秋のAP(応用技術者試験)についてどうしても理解(納得?)できない
  • メインプログラムを実行した結果はx=6 y=8となる
  • メモリ動的確保に関する関数g()をCで書くと、関数を抜けた時点で関数の領域が開放されるため、何度関数を呼び出しても戻り値は同じになる

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

static というのは、静的割り当てのことですよ。 なぜ、動的割り当てのmallocに置き換えようとしますか? 記憶クラスstaticで宣言された変数は、プログラム開始時から終了時まで、ずっと確保された変数が割り当てられます。これは、関数の内外を問わずです。スコープルールと、変数の寿命とは、別問題なので注意が必要です。 宣言時の初期化は、一回だけ行われて、その関数が二度目以降に実行された時には、当然以前の状態のままで、関数は実行されます。 つまり、 static v=1; と sutatic v; v=1; は、挙動が異なります。 今回の事例で言うと、g(2)+g(2)で、関数gは二回実行されますが、一度目で、関数終了時にvは、3になっていますから、二回目に実行された時には、vは3から始まって、引数uと加算され、5になって終了します。 もちろん、例の中の関数gはそのままc言語の関数の内容として有効です。

Falcon2
質問者

お礼

早速のご回答有皆様難うございました。 今までstaticは、使ったことありませんでした。 >スコープルールと、変数の寿命とは、別問題なので注意が必要です。 グローバル変数との違いは、 [スコープ] グローバル変数->ファイルが異なってもOK static -> ブロック内(ローカル変数) [変数の寿命] グローバル変数とstaticでは同じ(プログラムのメモリロード時から終了時まで) 皆様にとりましては、そんな事も知らないのかとお思いかと察しますが、いい勉強となりました。

その他の回答 (3)

回答No.4

皆さんのおっしゃるとおり、staticで書けます。 static int v = 1; で同じ動作が期待できます。 あと、 v = malloc( sizeof(int) ) を毎回実行していますので、結局正しく動作しません。 初回のみ実行するように仕様を変更する必要があります。 if (!yet) v = malloc( sizeof(int); 的な。

  • luka3
  • ベストアンサー率72% (454/624)
回答No.3

質問者さんの勘違いは static を理解していないということにつきます。 こちらが一番理解しやすいと思いましたので参考にしてください。 ・C言語入門 4.記憶クラス http://c-production.com/contents/c/sec04.html

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

>このg関数を無理やりCで書くと以下の様でしょうか? malloc()など使わなくても書けます。 無理矢理でもありません。