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언어