C언어 및 실습 C Language and Practice Chap. 2 : 변수의 영역 동국대학교 멀티미디어공학과 Young-Sik Jeong
C 언어메모리구조 지역변수들이저장되는곳. 정확히는지역변수와그에따른환경이같이저장된다. 복귀주소와호출함수의환경이저장된다. 동적기억장소를위한공간. 프로그램이실행되는중간에필요에의해서할당받는메모리영역을통칭한다. 크기가정해져있지않고유동적이다. 일반적으로 BSS 위쪽에존재한다. BSS(Block Started by Symbol) 초기화하지않은변수들의대한집합체. 메모리상공간만잡아놓고초기화시키지않는다. 실제로 BSS 영역에는어느정도의공간크기를저장할것이라는정보를저장한다. 그후런타임시에 Memory 에링크되어올라간후세그먼트로바뀔때영역이확보된다. data 영역은초기에사용할메모리를확보하는반면, BSS 영역에서는런타임후에야메모리영역이확보된다. CPU 에의해서수행되는기계어가있는곳으로읽기전용이다. 프로그램에서초기화된데이터들이모여있는장소이다. 프로그램실행도중자유롭게접근하여수정및변경이가능하다. ( 보통초기화된전역변수와정적변수가위치 ) 2
변수의영역 기억클래스 (storage class) 변수 주기억장치와레지스터중의어느곳에기억되는가를결정 변수의유효범위를결정 유효범위 : 한변수의저장장소, 프로그램에이변수가미치는범위및어떤기억장치를점유하는시간범위 Storage Class 저장장소변수의참조 (scope) 변수의생명 (life) 초기화하지않은경우변수에자동으로할당되는값 Register 변수 ( 레지스터 ) CPU 내의레지스터영역 선언된 block 내선언된 block 내쓰레기값 Auto( 자동 ) 변수 stack 선언된 block 내선언된 block 내쓰레기값 Static internal ( 내부정적 ) 변수 Static external ( 외부정적 ) 변수 Extern ( 외부 ) 변수 메모리상의데이터영역 선언된 block 내프로그램전체 0 source file 프로그램전체 0 프로그램전체프로그램전체 0 3
변수의영역 자동변수 (auto) 함수또는블록내에서만유효한지역변수 (local variable), stack 내에저장됨 자동변수의사용예 auto 변수선언 ; auto int a; /* int a; */ auto int b = 32; /* int b=32; */ auto char ch = c ; /* char ch = c; */ 프로그램의블록내의맨상단에기억클래스를선언하지않은변수 컴파일러는자동변수로간주 유효범위 선언되는블록내로한정, 프로그램수행이해당블록을벗어나면변수는미존재 자동변수가필요하지않을시기억장소를점유하지않음 어떤함수에국한된지역변수이기때문에다른함수의값을변경시킬수없음 안정성유지 4
변수의영역 레지스터변수 (register) 변수를메모리보다더빠르게처리하기위해사용 레지스터 ( 범용레지스터 :8 개 ) 에기억하는변수 레지스터변수의사용 register 변수선언 ; register int a; register int b = 32; register float c = 2.8; 주기억장치 (main memory) 에기억된데이터를처리하는것보다는레지스터의내용을처리하는것이더빠르다 => 프로그램의수행속도증가 유효범위 : 선언되는블록내로한정, 프로그램수행이그블록을벗어나면변수는존재하지않음 ( 자동변수와동일 : 국한된지역변수 ) 5
변수의영역 정적변수 (static) 메모리를정적으로할당 프로그램의제어가블록안으로옮겨도이전에기억한값을그대로유지 사용법 static 변수타입변수명 ; 변수의초기화 컴파일시데이터형에따라정해진값으로초기화됨 char : \0 int : 0 float or double : 0.0 유효범위 프로그램종료시까지데이터를가지고있음 어떤함수내에존재하는경우 함수를호출할때마다이전에적용된값을계속해서사용가능 6
변수의영역 외부변수 (extern) 두개이상의함수가블록에서자료를공유하고수정할수있는변수 사용법 유효범위 extern 변수타입변수명 ; 전역 ( 전체프로그램 ). 외부변수를 1개의단위프로그램에서만사용시외부에서선언되는 static변수와같은기능을가짐 ( extern int v1; = static int v1; ) 한프로그램내지역변수와전역변수가중복선언된경우에지역변수가우선권이높음 7
변수의영역 외부변수 (extern) 초기값을할당하지않은경우 정적변수와같은초기값이할당 함수의밖에서변수를정의하여외부변수로사용 이때, extern 과함께선언할필요는없으나, 예 ) [extern] int var1; 외부변수의선언문이다른파일에있는경우에는반드시예약어 extern 과함께선언 외부변수와외부정적변수의차이점 외부정적 (static external) 변수 : 같은파일내에존재하는함수들에의해서만사용 외부 (extern) 변수 : 어떤다른파일내에존재하는함수들에의해서도사용가능 8
선행처리기 선행처리기 (preprocessor) 원시코드를컴파일러가컴파일하기전에특정한변수를정의된문자열로치환하는기능 매크로정의 #define 매크로명문자열 ( 예, #define PI 3.1415926536) PI = 3.145926536 매크로확장 #define 매크로명 ( 인수 ) 인수가포함된수식또는함수 파일포함 #include 파일명, 또는 #include < 파일명 > 9
선행처리기 매크로정의 매크로는긴문장이나여러줄의문장을대신하는용어일반형식 정의방법 #define 매크로명치환문자열 매크로명은공백을불허용 매크로명작성시관례적으로대문자들로명명 #define과매크로명, 치환문자열사이 적어도하나이상의공백 (blank) 이나탭 (tab) 으로구분 ;( 세미콜론 ) 붙이지않음 #define줄에표준 C 주석문을붙일수있음 #define문이길어져하나이상의줄을차지할때에는백슬래시 (\, \) 를사용 10
선행처리기 매크로확장 선행처리기에서는인수를동반한문자열치환매크로가허용 인수를가진매크로는인수가괄호안에쓰여지므로함수로생각될수있음 일반형식 #define 매크로명 ( 인수 ) 인수가포함된수식또는함수 매크로정의와확장 #define AREA(x) (3.1415926536 * x * x) void main() { printf( %f\n, AREA(2.5)); /* AREA(2.5) (3.1415926536 * 2.5 * 2.5) */ } void main() { printf( %f\n, 3.1415926536 * 2.5 * 2.5); } 11
선행처리기 매크로확장 주의점 매크로명과괄호사이에공백이존재해서는안됨 #define AREA(x) (O) #define AREA (x) (X) 매크로정의에서치환문자열전체가괄호안에포함되어야함 이때괄호내의인수가수식으로이루어질때실행순서가바뀌지않도록우선순위를기술 #define SQUARE(x) (x*x) #define SQUARE(x) ((x)*(x)) SQUARE(a+b) a+b*a+b /* x a+b */ SQUARE(a+b) (a+b)*(a+b) 12
선행처리기 파일포함 특정한파일을프로그램에불러들여사용한다. 사용법 #include 파일명 #include < 파일명 > 파일을현재의디렉토리에서먼저찾아본후, 파일이없을시표준라이브러리검색 파일을표준라이브러리만을대상으로검색 #include 명령을사용하여분할된파일을원시코드에포함 여러프로그램의모든부분에서사용되는값을설정하는매크로정의파일도원시파일에포함가능 13
선행처리기 기타선행처리기명령어 typedef 사용자가기존의자료형으로새로운자료형을만들게해주는도구 typedef 자료형선언할문자열 ; 호환성이요구되는프로그램에서프로그램을매개변수화할수있으며, 코드를간결하게해주고, 문서화에도움을줌 프로그래머가 unsigned char 을 BYTE 로사용하고싶은경우 typedef unsigned char BYTE; BYTE var1, var2; /* unsigned char var1, var2 와같음 */ 14
Q & A 15