몽상실현개발주의

[따배씨] 12.7 블록 영역의 정적 변수 Static 본문

Language/C

[따배씨] 12.7 블록 영역의 정적 변수 Static

migrationArc 2021. 6. 13. 15:57

[따배씨] 12.7 블록 영역의 정적 변수 Static

따배씨 - 따라하며 배우는 C언어

12강 Storage Classes, Linkage and Memory Management

12.7 블록 영역의 정적 변수 Static

  • 블록 밖에서 메모리 주소를 통해 접근이 가능하지만, 추천하지 않음
    • global 변수로 선언하는것이 좋음

 

#include <stdio.h>

void count(){
    int ct = 0;
    printf("count = %d %lld\n", ct, (long long)&ct);
}

void static_count(){
    static int ct = 0;  // initialized only once!
    printf("static count = %d %lld\n", ct, (long long)&ct);
    ct++;
}

void counter_caller(){
    count();
}

void static_counter_caller(){
    static_count();
}

//int func(static int i); // Error

int main(){
    count();
    // count = 0 140732920755292
    count();
    // count = 0 140732920755292
    counter_caller();
    // count = 0 140732920755276
    
    static_count();
    // static count = 0 4295000080
    static_count();
    // static count = 1 4295000080
    static_counter_caller();
    // static count = 2 4295000080
  
    return 0;
}
// 출력
count = 0 140732920755292
count = 0 140732920755292
count = 0 140732920755276
static count = 0 4295000080
static count = 1 4295000080
static count = 2 4295000080
  • 1, 2 번째 줄의 출력이 같은 이유는 변수와 함수의 갯수가 적어 우연히 같은 저장공간을 사용했기 때문
  • count 와 static_count 의 메모리 주소가 멀리 떨어져 있음
    • 자동 변수와 static 변수의 메모리 위치 참조
//int func(static int i); // Error
  • 함수가 실행 될 때 새로운 stack frame이 배정 되는데, 함수의 파라미터 변수는 함수가 실행이 될 때 메모리를 할당받기 때문에 static 변수가 될 수 없음

 

int* count(){
    int ct = 0;
    printf("count = %d %lld\n", ct, (long long)&ct);
  	ct++;
  
  	return &ct;	// Error
}
  • pointer 값을 함수의 return 값으로 받는것이 가능 하지만, function scope 변수인 ct는 함수가 종료되면서 할당받은 메모리가 사라지므로 ct의 주소값을 반환 할 수 없음

 

int* static_count(){
    static int ct = 0;  // initialized only once!
    printf("static count = %d %lld\n", ct, (long long)&ct);
    ct++;
  
	  return &ct;
}
  • 함수가 종료되어도 메모리 공간이 유지되는 static 변수이기 때문에 ct의 주소값 반환 가능
    • 하지만, 이렇게 사용하는 것 보다 전역변수로 사용하는 것이 더 권장

 

 


이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.

http://blog.naver.com/atelierjpro

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

Comments