電子書籍の厳選無料作品が豊富!

C言語において
int a = 1; // 動的グローバル変数
static int b = 2; //静的グローバル変数

funcA(){
int c = 3; // 動的ローカル変数
static int d = 4; //静的グローバル変数



}
上記のように各種変数を初期化したとします。
"c"のような動的ローカル変数であれば、funcA()が呼ばれたときに毎回初期化されますよね?

では
・"d"のような静的ローカル変数は、初めてfuncA()が呼ばれたときに初期化されるのですか?
・"a","b"のyほうなグローバル変数は、どのタイミングで初期化されるのですか?

以上2点について伺いたいと思います。

ちなみに、組み込み機器むけのソフトウェアを想定しています。

A 回答 (15件中11~15件)

> dはプログラムが開始されたときに領域確保+初期化され、



これも正しくないですね。
dはあくまでも関数内のローカル変数ですから、
当該関数の実行時に領域確保と初期化を行ないます。
仮に、当該プログラムが一度も当該関数を実行しないとすると、
dのための領域は当該プログラムの実行中確保されません。
staticが付いているから、一度領域を確保すると、
当該プログラムの実行中ずっとその内容を保持している、というだけです。
    • good
    • 0

> >int a = 1; // 動的グローバル変数


> >static int b = 2; //静的グローバル変数
> 関数外で宣言された変数はstaticと解釈されますので、
> 上記の記述に差はありません。

そんなことはないです。明確な違いがあります。
下記のサンプルコードで試してみてください。

// temp.c
#include <stdio.h>

int a = 1;
static int b = 2;

void func(void);

int main(void)
{
func();
return 0;
}

// temp-2.c
#include <stdio.h>

extern int a;
extern int b;

void func(void)
{
printf("a=%d\n", a);
printf("b=%d\n", b);
}

func()において、どこか別のファイルで定義した変数a, bの内容を
出力しようとしています。
変数aは正しく認識できますが、変数bはtemp.cの外からは見えません。
リンク時に「外部シンボル未解決」というエラーが出ます。
    • good
    • 0

>int a = 1; // 動的グローバル変数


>static int b = 2; //静的グローバル変数
関数外で宣言された変数はstaticと解釈されますので、
上記の記述に差はありません。
ちなみに、動的グローバル変数という言葉は聞いた事がありません。


staticと解釈された関数や変数はプログラムが実行される際に、
メモリにその領域が確保されます。

一方、dynamicと解釈された関数や変数は、
呼ばれたときにメモリに領域が確保されます。

ご提示いただいた変数でいうと、
a、b、dはプログラムが開始されたときに領域確保+初期化され、
cは関数開始時に領域確保+初期化されるはずです。

No.1の方がおっしゃるように、一度試されるとよいでしょう。
    • good
    • 0

>・"d"のような静的ローカル変数は、初めてfuncA()が呼ばれたときに初期化されるのですか?



そう思って良いでしょう。実際のタイミングはmain()実行の直前と思いますが、同じ事です。

>・"a","b"のyほうなグローバル変数は、どのタイミングで初期化されるのですか?

これもmain()実行の直前です。
ちなみに、グローバル変数に、静的・動的の区別はなく強いて言えばすべて静的です。そうするとstaticキーワードの意味が余るので、名前の有効活用の意味で関数やグローバル変数に付けられたstaticキーワードは別の意味を持ちます。「グローバルだけど他のファイルで定義された関数からはアクセスできない」という意味です。ローカル変数の動的・静的とは関係ありませんので、本来は別のキーワードを使えば混乱がなかったと思いますが、予約語を増やしたくなかったんでしょう。

この回答への補足

すいません。
言葉を間違えていました。

staticは静的変数
記載なし(記載するならauto)が動的ではなく自動変数でした。

補足日時:2008/05/18 00:54
    • good
    • 0

インクリメント表示して二度呼ぶとすぐに結果出ますよね。

この回答への補足

ご回答ありがとうございます。

試し方がよくわからないのですが
もう少し具体的に教えていただけますか?

補足日時:2008/05/18 01:49
    • good
    • 0

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