Develop
2003.04.23 10:56
[c] 스토리지 클래스(변수)
Views 8224 Comment 0
변수의 스코프(scope): 변수가 프로그램내에서 사용될 수 있는 범위
변수의 라이프타임(lifetime): 변수가 존재하는 시간(기간)
스토리지 클래스(storage class): 스토리지 클래스는 변수의 스코프와 라이프타임을 결정한다.
스토리지 클래스 종류
1. extern : 전역변수
스코프: 프로그램 전체
라이프타임: 프로그램이 실행되는 모든 시간
2. auto: 지역 변수
스코프: 변수가 선언된 블락이나 함수
라이프타임: 변수가 선언된 함수나 블락이 실행되는 동안
3. static: 정적 변수
스코프: 변수가 선언된 블락이나 함수
라이프타임: 프로그램이 실행되는 모든 시간 동안
4. register: 레지스터 변수, 프로그램의 최적화를 위해 사용된다.
스코프: auto와 동일
라이프타임: auto와 동일
*변수는 정의되기 전에 사용될 수 없다.
예제: storage.c
1 #include <stdio.h>
2
3 int extern_int = 10;
4
5 int add(int a, int b) {
6 auto int auto_int;
7 static int static_int;
8
9 auto_int = a + b + extern_int;
10 static_int += auto_int;
11 printf("tadd::auto_int = %dn", auto_int);
12 printf("tadd::static_int = %dn", static_int);
13 return auto_int;
14 }
15
16 main(int argc, char ** argv) {
17 register int i, sum = 0;
18 auto int d;
19
20 for(i=0; i < 5; i++) {
21 d = i*i;
22 extern_int++;
23 sum += add(i, d);
24 printf("n");
25 }
26 printf("sum = %d n", sum);
27 }
결과
#7 enterprise:/data1/student/c9844000% storage
add::auto_int = 11
add::static_int = 11
add::auto_int = 14
add::static_int = 25
add::auto_int = 19
add::static_int = 44
add::auto_int = 26
add::static_int = 70
add::auto_int = 35
add::static_int = 105
sum = 105
예제: storage2.c
1 #include <stdio.h>
2
3 int value = 10;
4
5 main(int argc, char ** argv) {
6 register int i;
7
8 printf("value = %dn", value);
9 for(i=0; i < 5; i++) {
10 int value = 20;
11 if(i == 2) {
12 int value = 30;
13 printf("ttvalue = %dn", value);
14 } else {
15 printf("tvalue = %dn", value);
16 }
17 }
18 printf("value = %dn", value);
19 }
결과
#15 enterprise:/data1/student/c9844000% storage2
value = 10
value = 20
value = 20
value = 30
value = 20
value = 20
value = 10
예제: storage3.c
1 #include <stdio.h>
2
3 int value = 10;
4
5 main(int argc, char ** argv) {
6 register int i;
7
8 printf("value = %dttt:&value = %pn", value, &value);
9 for(i=0; i < 5; i++) {
10 int value = 20;
11 if(i == 2) {
12 int value = 30;
13 printf("ttvalue = %dt:&value = %pn", value, &value);
14 } else {
15 printf("ttvalue = %dt:&value = %pn", value, &value);
16 }
17 }
18 printf("value = %dttt:&value = %pn", value, &value);
19 }
결과
#22 enterprise:/data1/student/c9844000% storage3
value = 10 :&value = 20b08
value = 20 :&value = effffa38
value = 20 :&value = effffa38
value = 30 :&value = effffa34
value = 20 :&value = effffa38
value = 20 :&value = effffa38
value = 10 :&value = 20b08
예제: storage4.c
1 #include <stdio.h>
2
3 int value = 10;
4
5 main(int argc, char ** argv) {
6 register int i;
7
8 printf("value = %dttt:&value = %pn", value, &value);
9 for(i=0; i < 5; i++) {
10 static int value = 20;
11 if(i == 2) {
12 int value = 30;
13 printf("ttvalue = %dt:&value = %pn", value, &value);
14 } else {
15 printf("ttvalue = %dt:&value = %pn", value, &value);
16 }
17 }
18 printf("value = %dttt:&value = %pn", value, &value);
19 }
결과
#28 enterprise:/data1/student/c9844000% storage4
value = 10 :&value = 20b10
value = 20 :&value = 20b14
value = 20 :&value = 20b14
value = 30 :&value = effffa38
value = 20 :&value = 20b14
value = 20 :&value = 20b14
value = 10 :&value = 20b10
예제: storage5.c
1 #include <stdio.h>
2
3 int value = 10;
4
5 main(int argc, char ** argv) {
6 register int i, sum = 0;
7
8 printf("sum = %dttt:&sum = %pn", sum, &sum);
9 printf("value = %dttt:&value = %pn", value, &value);
10 for(i=0; i < 5; i++) {
11 static int value = 20;
12 if(i == 2) {
13 int value = 30;
14 printf("ttvalue = %dt:&value = %pn", value, &value);
15 } else {
16 printf("ttvalue = %dt:&value = %pn", value, &value);
17 }
18 }
19 printf("value = %dttt:&value = %pn", value, &value);
20 }
컴파일
#32 enterprise:/data1/student/c9844000% cc -o storage5 storage5.c
"storage5.c", line 8: cannot take address of register: sum
#34 enterprise:/data1/student/c9844000% gcc -o storage5 storage5.c
storage5.c: In function `main':
storage5.c:8: warning: address of register variable `sum' requested
예제: storage6.c
1 #include <stdio.h>
2
3 int extern_int = 10;
4 extern int add(int, int);
5
6 main(int argc, char ** argv) {
7 register int i, sum = 0;
8 auto int d;
9
10 for(i=0; i < 5; i++) {
11 d = i*i;
12 extern_int++;
13 sum += add(i, d);
14 printf("n");
15 }
16 printf("sum = %d n", sum);
17 }
18
19 int add(int a, int b) {
20 auto int auto_int;
21 static int static_int;
22
23 auto_int = a + b + extern_int;
24 static_int += auto_int;
25 printf("tadd::auto_int = %dn", auto_int);
26 printf("tadd::static_int = %dn", static_int);
27 return auto_int;
28 }
결과
#37 enterprise:/data1/student/c9844000% storage6
add::auto_int = 11
add::static_int = 11
add::auto_int = 14
add::static_int = 25
add::auto_int = 19
add::static_int = 44
add::auto_int = 26
add::static_int = 70
add::auto_int = 35
add::static_int = 105
sum = 105
예제: storage7.c
1 #include <stdio.h>
2
3 int value = 10;
4
5 main(int argc, char ** argv) {
6 register int i;
7 int value = 20;
8
9 printf("value = %dn", value);
10 for(i=0; i < 5; i++) {
11 extern int value;
12 if(i == 2) {
13 int value = 30;
14 printf("ttvalue = %dn", value);
15 } else {
16 printf("tvalue = %dn", value);
17 }
18 }
19 printf("value = %dn", value);
20 }
결과
#45 enterprise:/data1/student/c9844000% storage7
value = 20
value = 10
value = 10
value = 30
value = 10
value = 10
value = 20
No. | Category | Subject | Author | Date | Views |
---|---|---|---|---|---|
469 | Develop | [c++][mfc] 파일 입출력 샘플 (한줄씩 읽어서 다른 파일에 쓰기) | hooni | 2013.04.23 | 15064 |
468 | Develop | [c++] mfc 이용한 기본적인 형변환 예제 | hooni | 2013.04.23 | 11510 |
467 | Develop |
[c++] mfc 이용한 트레이아이콘(TrayIcon) 클래스 예제 프로젝트
![]() |
hooni | 2013.04.23 | 8834 |
466 | Develop |
[c++] mfc이용한 트레이아이콘(TrayIcon) 클래스 예제 프로젝트
![]() |
hooni | 2013.04.23 | 9278 |
465 | Develop |
[c++] winsock을 이용한 서버,클라이언트와 ssl서버,클라이언트
![]() |
hooni | 2013.04.23 | 7643 |
464 | Develop |
[c] 문자열 str_shift 예제..
![]() |
hooni | 2013.04.23 | 6862 |
463 | Develop |
[c] kmp 활용 search
![]() |
hooni | 2013.04.23 | 7439 |
462 | Develop | [c++] mfc 기반 레지스트리(registry) 컨트롤 예제 코드 2 | hooni | 2013.04.23 | 15383 |
461 | Develop |
[c++] mfc 기반 멀티수납(wall)시스템 소스와 실행파일
![]() |
hooni | 2013.04.23 | 7085 |
460 | Develop | 다운 받아서 테스트 해볼것.. | hooni | 2013.04.23 | 9176 |
459 | Develop |
[c++] mfc로 만든 현재 디렉토리 읽어오기/세팅하기 (GetCurrentDirectory/SetCurrentDirectory)
![]() |
hooni | 2013.04.23 | 8524 |
458 | Develop |
[c#] BFilter 툴바 소스 코드 ㅎㅎ
![]() |
hooni | 2013.04.23 | 7672 |