본문 바로가기
IVS/C 프로그래밍

[C] 지역변수(local), 전역변수(global), 정적변수(static)

by 코곰_ 2025. 1. 13.

 

C 언어에서 정적 변수, 지역 변수, 전역 변수는 변수의 선언 위치와 저장 클래스(storage class)에 따라 구분되며, 각각의 생명 주기, 유효 범위, 초기화 방식 등이 다르다.

 

 

1. 지역 변수 (Local Variable)

  • 함수 안에서만 접근이 가능하며, 함수를 벗어나면 변수의 메모리 공간이 소멸된다. 
  • 정의: 함수나 블록 내부에서 선언된 변수.
  • 저장 위치: 함수 호출 시 스택 메모리에 저장됨.
  • 생명 주기:
    • 함수 또는 블록이 실행될 때 생성되고, 실행이 끝나면 소멸됨.
    • 매번 새로 생성되므로 이전 값을 유지하지 않음.
  • 유효 범위: 변수가 선언된 블록 내부에서만 접근 가능.
  • 초기화: 자동 변수는 초기화되지 않음. 초기화를 명시하지 않으면 쓰레기 값을 가짐.

 

 

 

2. 전역 변수 (Global Variable)

  • 모든 곳에서 접근 가능하고, 프로그램 종료 전에는 메모리가 소멸되지 않는다.
  • 정의: 모든 함수 외부에서 선언된 변수.
  • 저장 위치: 프로그램이 실행되는 동안 데이터 영역에 저장됨.
  • 생명 주기:
    • 프로그램이 시작할 때 생성되고, 프로그램이 종료될 때 소멸됨.
    • 모든 함수에서 공유됨.
  • 유효 범위: 프로그램 전체. 단, extern 또는 static 키워드를 사용하여 접근 범위를 조정할 수 있음.
  • 초기화: 명시적으로 초기화하지 않으면 기본적으로 0으로 초기화됨.

 

 

 

 

 

3. 정적 변수 (Static Variable)

  • 전역 변수와 유사하게, 프로그램이 종료되기 전까지, 메모리가 소멸되지 않는 변수
  • 단, 전역 변수와 달리 초기화가 only 한번만 진행된다.
  • 초기화할 때 반드시 상수로 초기화 해야한다. (초기화하지 않으면 default 0으로 자동 초기화)

(1) 정적 지역 변수(static local variable)

  • 정의: static 키워드로 선언된 지역 변수.
  • 저장 위치: 데이터 영역에 저장됨.
  • 생명 주기:
    • 프로그램 실행 동안 유지되며, 블록을 벗어나도 값이 소멸되지 않음.
    • 블록 내부에서만 접근 가능.
  • 유효 범위: 변수가 선언된 블록 내부.
  • 초기화: 한 번만 초기화되며, 명시적으로 초기화하지 않으면 기본값은 0.

 

(2) 정적 전역 변수(static global variable)

  • 정의: 전역 변수 앞에 static 키워드를 붙여 선언.
  • 저장 위치: 데이터 영역에 저장됨.
  • 생명 주기:
    • 프로그램 실행 동안 유지됨.
  • 유효 범위:
    • 선언된 파일 내부에서만 접근 가능.
    • 다른 파일에서 접근하려면 사용할 수 없음. (=외부에서 가져다 쓸 수 없다.)

 

 

요약

특징 지역 변수 전역 변수 정적 변수
저장 클래스 auto(기본) extern static
저장 위치 스택(stack) 데이터 영역 데이터 영역
생명 주기 함수/블록 실행 중 생성/소멸 프로그램 시작/종료 시 생성/소멸 프로그램 시작/종료 시 생성/소멸
유효 범위 블록 내부 프로그램 전체 블록 내부(지역) 또는 파일 내부(전역)
초기화 초기화하지 않으면 쓰레기 값 초기화하지 않으면 0 초기화하지 않으면 0

 

 

 

 

 

 

 

 

 

 

 


~수정중~

print.c

#include <stdio.h>
// static int count = 0; 
int count = 0;
// static void print3()
void print3(){
    count++;
    printf("print3 : %d\n", count); 
}

 

main.c

#include <stdio.h> 
#include <stdlib.h>
// extern void print3(); 
extern int count;

void print1() {
    int count = 0;
    count++;
    printf("print1 : %d\n", count); 
}

void print2() {
    static int count = 0;
    count++;
    printf("print2 : %d\n", count); 
}

int main()
{
    print1();
    print1();
    print1();
    print2();
    print2();
    print2();
    print3();
    print3();
    print3();
    print3(); 
    printf("count : %d\n", count); 
    system("pause"); 
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'IVS > C 프로그래밍' 카테고리의 다른 글

[C] 함수 포인터  (0) 2025.01.13
[C] 공용체(union), 열거체(enum)  (0) 2025.01.13
[C] 구조체 - 바이트 패딩(Byte Padding)  (0) 2025.01.13
[C] 배열 복사- memcpy, 비교- memcmp  (0) 2025.01.13
[C] 메모리 관련  (0) 2025.01.13