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で初期化しているので
何度呼び出しても戻り値は同じです。
さらに仮に初期化をしないにしても関数を抜けた時点で関数の領域は開放されるので
何度関数を呼び出しても戻り値は同じになります。
ご指摘を宜しくお願い致します。
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言語の関数の内容として有効です。
早速のご回答有皆様難うございました。
今までstaticは、使ったことありませんでした。
>スコープルールと、変数の寿命とは、別問題なので注意が必要です。
グローバル変数との違いは、
[スコープ]
グローバル変数->ファイルが異なってもOK
static -> ブロック内(ローカル変数)
[変数の寿命]
グローバル変数とstaticでは同じ(プログラムのメモリロード時から終了時まで)
皆様にとりましては、そんな事も知らないのかとお思いかと察しますが、いい勉強となりました。
No.4
- 回答日時:
皆さんのおっしゃるとおり、staticで書けます。
static int v = 1;
で同じ動作が期待できます。
あと、
v = malloc( sizeof(int) )
を毎回実行していますので、結局正しく動作しません。
初回のみ実行するように仕様を変更する必要があります。
if (!yet) v = malloc( sizeof(int);
的な。
No.3
- 回答日時:
質問者さんの勘違いは static を理解していないということにつきます。
こちらが一番理解しやすいと思いましたので参考にしてください。
・C言語入門 4.記憶クラス
http://c-production.com/contents/c/sec04.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パソコンに何かが勝手にダウン...
-
Excel実行時エラー-2146959355?
-
eclipseで、「ポート番号が使用...
-
パソコンのスクリーンセーバー...
-
プログラムが書けません。
-
VBA コントロールパネルの機能...
-
VB.NETでボタンのクリックイベ...
-
VBA 作成中のプログラムを使っ...
-
EXCEL-VBAでコマンド...
-
chatGPTで次々と質問をしていく...
-
ランタイム関数とは何ですか?
-
latexでのエラー
-
pythonで他のアプリを操作する...
-
Flashゲームをホームページで楽...
-
VB.NETを実行するにはどうした...
-
プログラム実行中に強制停止さ...
-
エクセルVBA、ステップモードと...
-
COBOLで集団項目から符号...
-
プログラミングについてです。...
-
VSコード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パソコンに何かが勝手にダウン...
-
chatGPTで次々と質問をしていく...
-
Excel実行時エラー-2146959355?
-
PC版のMinecraftが応答なしにな...
-
至急!RedmiPadを文鎮化させて...
-
VSコード
-
管理者として実行を毎回すると...
-
エクセルVBA、ステップモードと...
-
VB.NETでボタンのクリックイベ...
-
eclipseで、「ポート番号が使用...
-
EXCEL-VBAでコマンド...
-
プログラミングについてです。...
-
パソコンのスクリーンセーバー...
-
pythonで他のアプリを操作する...
-
プログラム実行中に強制停止さ...
-
latexでのエラー
-
プロパティの値が不正ですって...
-
Flashゲームをホームページで楽...
-
起動したアプリケーションを最...
-
「管理者として実行」された場...
おすすめ情報