C의 정적 변수

Jinku Hu 2023년10월12일
  1. static변수를 사용하여 C에서 함수 호출 사이의 값 유지
  2. static 키워드를 사용하여 C의 파일 범위 내에서 변수 선언
C의 정적 변수

이 기사에서는 C에서 정적 변수를 사용하는 방법에 대한 여러 방법을 보여줍니다.

static변수를 사용하여 C에서 함수 호출 사이의 값 유지

static 키워드는 여러 컨텍스트에서 사용되며 그 중 하나는 함수 호출 사이에 메모리에 값을 유지하는 변수를 선언하는 것입니다. 이 유형의 변수에는 정적 저장 기간이 있습니다.

다음 예제에서는 펑션 블록 범위에서 변수k를 선언합니다. 제어 흐름이 up함수를 벗어나면 k값은 프로그램이 종료 될 때까지 메모리에 유지됩니다. 이 동작은 프로그램 실행 중에 데이터 개체를 지속적으로 저장하는 데 사용할 수 있습니다.

정적 변수는 명시 적으로 초기화하지 않으면 자동으로 0으로 초기화됩니다.

#include <stdio.h>
#include <stdlib.h>

static int j = 0;

void up(void) {
  static int k = 0;
  j++;
  k++;
  printf("  up() called. k=%2d, j=%2d\n", k, j);
}

int main() {
  int i;

  for (i = 0; i < 3; i++) up();

  exit(EXIT_SUCCESS);
}

출력:

up() called. k= 1, j= 1
up() called. k= 2, j= 2
up() called. k= 3, j= 3

static 키워드를 사용하여 C의 파일 범위 내에서 변수 선언

static한정 변수는 모든 함수 외부에서 선언 할 수 있으므로 단일 소스 파일 범위 내에서 볼 수 있습니다. 이러한 변수를 내부 연결이있는 정적 변수라고합니다. 즉, 동일한 파일의 함수에서만 해당 값을 사용할 수 있습니다.

두 함수 모두 k라는 이름의 지역 변수가 0으로 초기화되었지만 down함수가 호출되면 변수 k( up에서 선언 됨)가 동일한 범위에 있지 않고 새 변수가 다른 메모리 위치에서 초기화됩니다. 따라서 두 번의 반복 후에 음수 값이 표시됩니다. 함수 매개 변수는 ‘정적’한정자를 가질 수 없습니다.

#include <stdio.h>
#include <stdlib.h>

static int j = 0;

void up(void) {
  static int k = 0;
  j++;
  k++;
  printf("  up() called. k=%2d, j=%2d\n", k, j);
}

void down(void) {
  static int k = 0;
  j--;
  k--;
  printf("down() called. k=%2d, j=%2d\n", k, j);
}

int main() {
  int i;

  for (i = 0; i < 3; i++) up();
  for (i = 0; i < 2; i++) down();

  exit(EXIT_SUCCESS);
}

출력:

up() called. k= 1, j= 1
up() called. k= 2, j= 2
up() called. k= 3, j= 3
down() called. k=-1, j= 2
down() called. k=-2, j= 1
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook