C言語 static 変数

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 目次