
C言語において
int a = 1; // 動的グローバル変数
static int b = 2; //静的グローバル変数
funcA(){
int c = 3; // 動的ローカル変数
static int d = 4; //静的グローバル変数
・
・
・
}
上記のように各種変数を初期化したとします。
"c"のような動的ローカル変数であれば、funcA()が呼ばれたときに毎回初期化されますよね?
では
・"d"のような静的ローカル変数は、初めてfuncA()が呼ばれたときに初期化されるのですか?
・"a","b"のyほうなグローバル変数は、どのタイミングで初期化されるのですか?
以上2点について伺いたいと思います。
ちなみに、組み込み機器むけのソフトウェアを想定しています。
No.5
- 回答日時:
> dはプログラムが開始されたときに領域確保+初期化され、
これも正しくないですね。
dはあくまでも関数内のローカル変数ですから、
当該関数の実行時に領域確保と初期化を行ないます。
仮に、当該プログラムが一度も当該関数を実行しないとすると、
dのための領域は当該プログラムの実行中確保されません。
staticが付いているから、一度領域を確保すると、
当該プログラムの実行中ずっとその内容を保持している、というだけです。
No.4
- 回答日時:
> >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の外からは見えません。
リンク時に「外部シンボル未解決」というエラーが出ます。
No.3
- 回答日時:
>int a = 1; // 動的グローバル変数
>static int b = 2; //静的グローバル変数
関数外で宣言された変数はstaticと解釈されますので、
上記の記述に差はありません。
ちなみに、動的グローバル変数という言葉は聞いた事がありません。
staticと解釈された関数や変数はプログラムが実行される際に、
メモリにその領域が確保されます。
一方、dynamicと解釈された関数や変数は、
呼ばれたときにメモリに領域が確保されます。
ご提示いただいた変数でいうと、
a、b、dはプログラムが開始されたときに領域確保+初期化され、
cは関数開始時に領域確保+初期化されるはずです。
No.1の方がおっしゃるように、一度試されるとよいでしょう。
No.2
- 回答日時:
>・"d"のような静的ローカル変数は、初めてfuncA()が呼ばれたときに初期化されるのですか?
そう思って良いでしょう。実際のタイミングはmain()実行の直前と思いますが、同じ事です。
>・"a","b"のyほうなグローバル変数は、どのタイミングで初期化されるのですか?
これもmain()実行の直前です。
ちなみに、グローバル変数に、静的・動的の区別はなく強いて言えばすべて静的です。そうするとstaticキーワードの意味が余るので、名前の有効活用の意味で関数やグローバル変数に付けられたstaticキーワードは別の意味を持ちます。「グローバルだけど他のファイルで定義された関数からはアクセスできない」という意味です。ローカル変数の動的・静的とは関係ありませんので、本来は別のキーワードを使えば混乱がなかったと思いますが、予約語を増やしたくなかったんでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
DLLは解読可能ですか
-
Windowsコモンコントロールのcy...
-
プレコンパイルの意味を教えて...
-
<math.h>ヘッダを入力している...
-
C言語で、配列を使ったsinカー...
-
dos.hについて
-
自作DLLの中身を暗号化
-
CMakeでfortranをコンパイルしたい
-
Borland C++ Compiler 5.5の使...
-
VSC などが苦手
-
C言語なうなんですが、コンパイ...
-
コンパイル時のスイッチについて
-
リムーバブルディスクをPCへ挿...
-
不明なプラグマ・・・?
-
Makefileでのコンパイル方法
-
Linux(g++)とAIX(XL C++)の挙動...
-
visual studio と developer s...
-
ARDUINO <MsTimer2.h> にわかに...
-
コマンドラインやバッチファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
c言語です コンパイルした時に...
-
共有ライブラリの内容確認について
-
すべてのリビルド: 0 正常、 0 ...
-
ビープ音が鳴りません・・・
-
C#で char型とstring型の比較で...
-
[COBOL] ソースの復帰
-
ヘッダーファイル『windows.h』...
-
シリアル通信の受信待ちについて
-
自作DLLの中身を暗号化
-
64ビットのlinuxで32ビットメモ...
-
gcc バージョン違いによるコン...
-
Cのコンパイルでコメントアウト...
-
プレコンパイルの意味を教えて...
-
gccでc++プログラムをコンパイ...
-
VS2010環境で2点ほど質問
-
VBで作成したOCXでバージョンが...
おすすめ情報