기본 콘텐츠로 건너뛰기

기억부류

변수에 저장된 값이 유효하게 사용될 수 있는 프로그램 내에서의 범위를 변수의 범위라고 한다. 변수의 사용영역에 따라 지역변수, 전역변수로 나뉠 수 있고, 변수의 존속기간에 따라 자동변수, 정적변수, 외부변수, 레지스터변수로 나뉠 수 있다.

외부 변수

전역 변수라고도 하며, 다른 함수에서 정의된 변수를 공유하고자 할 때 사용한다.
함수의 밖에서 선언되며, 여러 소스 파일 간에 사용하려는 때에는 extern 키워드를 사용한다. extern은 실제로 변수를 선언하는 것이 아니라 다른 파일에서 변수가 선언되었음을 알려주는 역할을 한다.
초기화되지 않은 경우에 0값을 가짐. 외부변수와 프로그램 데이터가 저장되는 데이터 세그먼트에 저장된다.
 1 #include <stdio.h>
 2 
 3 /*
 4      외부변수
 5 */
 6 
 7 int x = 100;
 8 
 9 void fun1()
10 {
11     printf("fun1 : x = %d\n", x);
12     x = 200; 
13 }
14 
15 int main ()
16 {
17     
18     printf("main : x = %d\n", x);
19     fun1();
20     printf("main : x = %d\n", x);
21     system("PAUSE");
22     return 0;
23 }


 1 #include <stdio.h>
 2 
 3 /*
 4     extern 전역변수 #1
 5 */
 6 void fun2(void);
 7 
 8 int x = 100;
 9 
10 void fun1()
11 {
12     printf("fun1 : x = %d\n", x);
13     x = 200;
14 }
15 
16 int main ()
17 {  
18     printf("main : x = %d\n", x);
19     fun1();
20     fun2();
21     printf("main : x = %d\n", x);
22     system("PAUSE");
23     return 0;
24 }


 1 #include <stdio.h>
 2 
 3 /*
 4     extern 전역변수 #2
 5 */
 6 extern int x;
 7 
 8 void fun2()
 9 {
10     printf("fun2 : x = %d\n", x);
11     x = 300;
12     printf("fun2 : x = %d\n", x);  
13 
14 }




내부 변수

자동변수

지역 변수라고도 하며, 함수 실행시에 만들어지며, 변수가 선언된 블럭이나 함수 내에서만 유효하고, 함수가 종료되면 메모리에서 제거된다.
auto 키워드를 사용해서 선언하며 생략해도 된다.  스택에 저장된다.
함수의 매개변수는 자동변수이다.

 1 #include <stdio.h>
 2 
 3 /*
 4     지역변수
 5 */
 6 int x = 100;
 7 
 8 void fun1()
 9 {
10     int x = 10;
11     printf("fun1 : x = %d\n", x);  
12 }
13 
14 int main ()
15 {  
16     printf("main : x = %d\n", x);
17     fun1();
18     printf("main : x = %d\n", x);
19     system("PAUSE");
20     return 0;
21 }


정적변수

변수의 기억영역이 프로그램이 종료될 때까지 계속 유지된다.
static 키워드를 사용해서 선언하며, 초기화되지 않은 때에는 0값을 가지며, 변수가 정의되는 처음에만 초기화가 수행되고 이후에는 값이 보존된다.
기본적으로는 블럭 내에서만 유효하지만, 함수의 바깥에 선언하는 경우에는 정적 외부변수가 된다.
 1 #include <stdio.h>
 2 
 3 /*
 4     정적 변수
 5 */
 6 
 7 void fun1()
 8 {
 9     static int x = 1;
10     printf("fun1 : x = %d\n", x);  
11     x++;
12 }
13 
14 int main ()
15 {  
16     fun1();
17     fun1();
18     fun1();
19     system("PAUSE");
20     return 0;
21 }

결과는 1, 2, 3이 출력된다.


레지스터변수

CPU 내의 레지스터에 값을 저장하려는 때에 register 키워드를 사용해서 선언한다. 레지스터에 값을 저장하면 실행 속도가 빨라질 수있지만 크기와 갯수가 한정되어 있으므로 register를 선언했다고해서 반드시 레지스터에 변수가 생성되는 것은 아니다.

댓글

이 블로그의 인기 게시물

C 표준, GCC 그리고 컴파일 옵션

GCC supports three versions of the C standard, although support for the most recent version is not yet complete. The original ANSI C standard (X3.159-1989) was ratified in 1989 and published in 1990. This standard was ratified as an ISO standard (ISO/IEC 9899:1990) later in 1990. There were no technical differences between these publications, although the sections of the ANSI standard were renumbered and became clauses in the ISO standard. This standard, in both its forms, is commonly known as  C89 , or occasionally as  C90 , from the dates of ratification. The ANSI standard, but not the ISO standard, also came with a Rationale document. To select this standard in GCC, use one of the options  -ansi ,  -std=c90  or  -std=iso9899:1990 ; to obtain all the diagnostics required by the standard, you should also specify  -pedantic  (or  -pedantic-errors  if you want them to be errors rather than warnings). See  Options Controlling C Dialect . Errors in the 1990 ISO C standard were cor

연산자 우선 순위

() (괄호) [] (배열) -> (포인터멤버) . (구조체멤버) ! (부정) ~ (1의보수) ++ (증가) -- (감소) - (부호)  + (부호)  (자료형) (형변환)  * (포인터)  & (주소)  sizeof * (곱셈) / (나눗셈) % (나머지) + (덧셈) - (뺄셈) << >> (비트이동) < <= > >= (관계) == != (관계) & (비트논리곱) ^ (비트배타논리합) | ( 비트논리합 ) && (논리곱) || (논리합) ?: (조건) = (할당) += -= *= /= %= &= ^= |= <<= >>= (복합할당) , (쉼표)

errno.h

errno.h 파일에는 오류 코드를 기억할 수 있는 errno가 매크로로 정의되어 있고, 그 외에 각종 오류 코드 넘버들이 매크로 상수로 정의되어 있다. 프로그램 시작시에는 errno의 값이 0으로 초기화되며, 특정 오류가 발생한 때에는 이 값이 해당 오류 코드로 바뀐다. 프로그램에서도 이 값을 읽거나 수정할 수 있다. #include   <stdio.h> #include   <errno.h> int   main () {           printf ( "%d\n"   , errno);        errno = ENOMEM;           printf ( "%d\n"   , errno);           return   0; }