みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Cの変数の初期化のタイミングについて

以下のようなCの演習プログラムについてお尋ねします。
やっていることは、inc_counterと言う関数を呼び出して呼び出すたびに変数を1つづつ増やすというもので、10回呼び出すので変数が10になるというものです。この演習プログラムが言いたいことは変数counterの動作ということです。
externですべての関数の外側で宣言されているから呼び出す側、呼び出される側で共通になっているということですが、void inc_couter(void)の実体(後方)の前にint counter=0;となっています。この文は変数counterの初期化ということだと思いますが、これが実行されるのはいつなのでしょうか。関数inc_counerの呼び出しのときは実行されないのでしょうか。もしそうなら関数が呼び出されるたびに初期化されるはずですが、そうではないのでしょうか。
変数のスコープとか初期化とかの問題だと思いますが、この辺を間違って理解すると大けがをしそうなのでお尋ねします。よろしくお願いします。

#include<stdio.h>
extern int counter;
void inc_counter(void);
main()
{
int index;
for(index=0; index<10; index++) inc_counter();
(void) printf("Counter is %d\n",counter);
return (0);
}

int counter=0;
void inc_counter(void)
{
counter++;
}

投稿日時 - 2019-06-23 17:07:46

QNo.9628500

困ってます

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

>これが実行されるのはいつなのでしょうか。
mainをシステムが呼ぶ直前です。
なので、mainに入った時点で初期化済みという感じです。

専門的に言えば、これはDATA領域と呼ばれますが、
もしも、
int counter;
void init_counter(void)
{
counter=0;
}
と初期値がない場合は、BSS領域に配置されています。
(通常あんまり気にする意味はないんですが)

投稿日時 - 2019-06-23 17:22:31

お礼

回答ありがとうございました。C言語を勉強すると、情報処理の深いところまで行くことになるし、その辺のケアがないと大けがするという気がしています。Cをやると本業そっちのけで集中しないといけないところがあり、本当はやりたくないのですが。参考にさせていただきます。

投稿日時 - 2019-07-08 16:36:46

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

inc_counterの外側なので、 inc_counter の呼び出しとは関係ありません。
プログラム起動時点で、最初から0が代入されており、その後は更新されるがままです。この記述により0が再度代入されることはありません。

投稿日時 - 2019-06-23 18:17:11

お礼

回答ありがとうございました。呼び出した時点では関数の外側なのでそれが実行されることはないわけですね。mainと関数が別ファイルだとファイル全体が呼び出されるように思えて錯覚してしまいました。

投稿日時 - 2019-06-23 23:08:02