
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# 競技プログラミングに関する質問です。 3 2022/04/03 19:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
コンパイル時に「out of memory...
-
ビープ音が鳴りません・・・
-
WindowsでのC と LinuxでのC...
-
実行後にコンパイルに失敗しま...
-
64ビットのlinuxで32ビットメモ...
-
<unistd.h>をVisualStudioでつ...
-
C言語で作ったらWindowsでもMac...
-
python エラー
-
DLLファイルの逆コンパイラにつ...
-
Excelのエラーで困ってます。
-
エクセルのエラーメッセージ「4...
-
sys/time.hのインクルードがで...
-
プロシージャエントリポイント ...
-
マクロ コンパイルがグレーバック
-
ILSpyで、デコンパイルできない。
-
Excel VBAのデバッグ
-
cudaのnvccはmingwやgccでも使...
-
C++でデスクトップGUIアプリ開...
-
PathIsDirectoryを使って
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
シリアル通信の受信待ちについて
-
ビープ音が鳴りません・・・
-
C#で char型とstring型の比較で...
-
c言語です コンパイルした時に...
-
共有ライブラリの内容確認について
-
すべてのリビルド: 0 正常、 0 ...
-
64ビットのlinuxで32ビットメモ...
-
C言語で作ったらWindowsでもMac...
-
MS-BASICの逆コンパイルについて
-
<math.h>ヘッダを入力している...
-
ヘッダーファイル『windows.h』...
-
プレコンパイルの意味を教えて...
-
Verilog_HDLでのdefineとifdef
-
[COBOL] ソースの復帰
-
gcc バージョン違いによるコン...
-
同じEXE・同じファイルで解析結...
おすすめ情報