Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- BFS
- udemy
- dfs
- DP
- BOJ
- 백준
- Algorithm
- Cleancode
- Math
- BASIC
- 따배씨
- 따라하면서 배우는 C언어
- sorting
- php
- programmers
- C언어
- greedy
- graph
- C
- web
- 따라하며 배우는 C언어
- 종만북
- Python
- 생활코딩
- server
- 정수론
- String
- 인프런
- Algospot
- JavaScript
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 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의 주소값 반환 가능
- 하지만, 이렇게 사용하는 것 보다 전역변수로 사용하는 것이 더 권장
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
'Language > C' 카테고리의 다른 글
[따배씨] 12.9 정적 변수의 내부 연결 (0) | 2021.06.14 |
---|---|
[따배씨] 12.8 정적 변수의 외부 연결 (0) | 2021.06.14 |
[따배씨] 12.6 레지스터 변수 (0) | 2021.06.13 |
[따배씨] 12.5 자동 변수 (0) | 2021.06.13 |
[따배씨] 12.4 저장 공간의 다섯 가지 분류 (0) | 2021.06.13 |
Comments