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 |