static ローカル変数
staticがついたローカル変数は、プログラム開始時にメモリ上に作られ、関数の処理が終わっても変数の値は残り続け、プログラム終了時まで存在する。また何もしなくても0で初期化される。
#include <stdio.h>
int count(){
static int s_x; /* 値が残り続ける */
s_x++;
return s_x;
}
int main(void){
int a;
a = count();
printf("main1 a= %d\n",a);
a = count();
printf("main2 a= %d\n",a);
a = count();
printf("main3 a= %d\n",a);
return 0;
}
|
mainからcount関数を3回呼び出している。staticがなければ、変数「s_x」は毎回初期化され、同じ結果「1」が出るのだが、staticをつけることで、変数の値が残り続け、「1」「2」「3」となる。
main1 a= 1
main2 a= 2
main3 a= 3
|
static グローバル変数
グローバル変数にstaticキーワードを使用すると、そのファイル内でしか利用できなくなる。同じstaticキーワードだが、ローカル変数の時と意味合いが違う気がする・・ こういう部分がC言語のちょっとおかしなところ。
main関数 a.c
/* a.c */
#include <stdio.h>
#include "a.h"
/* グローバル変数を利用するために宣言をするが・・ */
extern int g_num;
int main(void){
funcB1();
funcB1();
/* printf("main %d\n",++g_num); エラーになる */
return 0;
}
|
実装ファイル b.c
/* b.c */
#include <stdio.h>
/* staticグローバル変数 */
static int g_num;
void funcB2(void){
printf("funcB2 %d\n",++g_num);
}
void funcB1(void){
printf("funcB1 %d\n",++g_num);
funcB2();
}
|
ヘッダファイル a.h
/* a.h */
#ifndef A_H
#define A_H
void funcB1(void);
void funcB2(void);
#endif
|
ファイル内でしか利用できないグローバル変数は便利そうだが、ローカル変数で実現できるのであれば、ローカル変数を利用すべきだろう。
funcB1 1
funcB2 2
funcB1 3
funcB2 4
|
C言語 ANSI C89 Meadow & MinGW GCC 目次