アプリ版:「スタンプのみでお礼する」機能のリリースについて

H23年秋のAP(応用技術者試験)についてどうしても理解(納得?)できない
下記問題についてお教えください。

(問)メインプログラムを実行した結果はどうなるか?ここでは、staticは、静的割り当てを、autoは動的割り当てを表す。

-----------------------メインプログラム--------------------------
auto int x,y;

x=f(2)+f(2);
y=g(2)+g(2);
-------------------------------------------------------------------

------------------------------f(u)--------------------------------
auto int u;
auto int v=1;
v=v+u;
return v;
-------------------------------------------------------------------

------------------------------g(u)--------------------------------
auto int u;
static int v=1;
v=v+u;
return v;
-------------------------------------------------------------------
(答)
x=6 y=8

このg関数を無理やりCで書くと以下の様でしょうか?
int g(int u){
int *v;
v=malloc(sizeof(int));
*v=1;
*v=*v+u;
return *v;
}

freeしていない時点で問題ですが、どっちみちvの指す領域を1で初期化しているので
何度呼び出しても戻り値は同じです。

さらに仮に初期化をしないにしても関数を抜けた時点で関数の領域は開放されるので
何度関数を呼び出しても戻り値は同じになります。

ご指摘を宜しくお願い致します。

A 回答 (4件)

static というのは、静的割り当てのことですよ。


なぜ、動的割り当てのmallocに置き換えようとしますか?
記憶クラスstaticで宣言された変数は、プログラム開始時から終了時まで、ずっと確保された変数が割り当てられます。これは、関数の内外を問わずです。スコープルールと、変数の寿命とは、別問題なので注意が必要です。
宣言時の初期化は、一回だけ行われて、その関数が二度目以降に実行された時には、当然以前の状態のままで、関数は実行されます。
つまり、
static v=1;

sutatic v;
v=1;
は、挙動が異なります。
今回の事例で言うと、g(2)+g(2)で、関数gは二回実行されますが、一度目で、関数終了時にvは、3になっていますから、二回目に実行された時には、vは3から始まって、引数uと加算され、5になって終了します。

もちろん、例の中の関数gはそのままc言語の関数の内容として有効です。
    • good
    • 0
この回答へのお礼

早速のご回答有皆様難うございました。

今までstaticは、使ったことありませんでした。

>スコープルールと、変数の寿命とは、別問題なので注意が必要です。
グローバル変数との違いは、
[スコープ]
グローバル変数->ファイルが異なってもOK
static -> ブロック内(ローカル変数)

[変数の寿命]
グローバル変数とstaticでは同じ(プログラムのメモリロード時から終了時まで)

皆様にとりましては、そんな事も知らないのかとお思いかと察しますが、いい勉強となりました。

お礼日時:2012/08/24 21:05

皆さんのおっしゃるとおり、staticで書けます。



static int v = 1;

で同じ動作が期待できます。
あと、

v = malloc( sizeof(int) )

を毎回実行していますので、結局正しく動作しません。
初回のみ実行するように仕様を変更する必要があります。

if (!yet) v = malloc( sizeof(int);

的な。
    • good
    • 0

質問者さんの勘違いは static を理解していないということにつきます。



こちらが一番理解しやすいと思いましたので参考にしてください。

・C言語入門 4.記憶クラス
http://c-production.com/contents/c/sec04.html
    • good
    • 0

>このg関数を無理やりCで書くと以下の様でしょうか?



malloc()など使わなくても書けます。
無理矢理でもありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!