C언어 - 블록 영역의 정적변수
2020. 11. 13. 13:13ㆍ개인공부/C언어
Static with no linkage는 블록안에서만 사용할수 있다. (블록안에서만 볼수있는것)
void count() {
int ct = 0; // count()함수가 호출될때마다 초기화가 된다.
printf("count = %d %lld\n", ct, (long long)&ct);
ct++;
}
void static_count() {
static int ct = 0; // 초기화 한번만 한다!
printf("static count = %d %lld\n", ct, (long long)&ct);
ct++;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/*
Automatic storage class
-Automatic storage duration, block scope, no linkage
-Any variable declared in a block or function header
*/
void count() {
int ct = 0; // count()함수가 호출될때마다 초기화가 된다.
printf("count = %d %lld\n", ct, (long long)&ct);
ct++;
}
void static_count() {
static int ct = 0; // 초기화 한번만 한다!
printf("static count = %d %lld\n", ct, (long long)&ct);
ct++;
}
void static_counter_caller() {
static_count();
}
int main() {
count();
count();
static_count();
static_count();
static_counter_caller();
return 0;
}
결과값:
count = 0 11794044
count = 0 11794044
static count = 0 15900984
static count = 1 15900984
static count = 2 15900984
count는 지역변수라 count() 함수가 끝나면 스택에서 빠지고, 호출될때 다시 초기화 되어서 값이 0
static count 는 메모리에 계속 올라와있기때문에 결과값이 누적 갱신된다.(유지됨)
int func(static int i){}
함수가 실행될때는 새로운 스택 프레임이 배정된다. 함수 파라미터 변수는 사실상 함수가 실행될때
메모리를 배정받는 구조.
GCC에선 에러가 난다.
int* count() {
int ct = 0; // count()함수가 호출될때마다 초기화가 된다.
printf("count = %d %lld\n", ct, (long long)&ct);
ct++;
return &ct;
}
위의 사례는 나쁜 사례이다.
포인터를 반환하는 경우도 있다.
지역변수의 포인터를 반환해주고 있는데
int ct=0; 변수는 count(){} 블록이 끝나면 사라진다.
int* static_count() {
static int ct = 0; // 초기화 한번만 한다!
printf("static count = %d %lld\n", ct, (long long)&ct);
ct++;
return &ct;
}
드물지만 가능한 경우다.
static int ct=0; 이 메모리에 고정된 주소를 가지고있다.
포인터를 반환해서 다른곳에 쓰일수 있다.
그렇지만 그런 용도라면 전역변수를 쓰는게 더 나은 방법이다.
출처 : 홍정모의 따라배우는 C언어
'개인공부 > C언어' 카테고리의 다른 글
C언어 - 메모리 동적 할당!! (Dynamic Storage Allocation) (0) | 2020.11.13 |
---|---|
C언어 - 정적 변수의 외부연결 (external linkage), 내부연결 (internal linkage) (0) | 2020.11.13 |
C언어 - 저장공간의 다섯가지 분류 , 자동변수, 레지스터 변수 (0) | 2020.11.13 |
C언어 - 변수의 영역과 연결 상태, 객체의 지속 기간 (0) | 2020.11.13 |
C언어 - 객체(Object)와 식별자(Identifier) , L-value R-value (0) | 2020.11.12 |