2016년 12월 7일 수요일

[C language] C 언어 기본 문법_4

10. 메모리 할당 
11. 매크로 선행처리기 
12. 파일 분할과



[10. 메모리 할당]


1. 메모리 구조

-코드 영역 : 코드가 저장되는 메모리 공간. 
-데이터 영역 : 전역변수와 static변수 할당. 프로그램 종료 시까지 남아있게 됨.
-스택 영역 : 지역변수와 매개변수. 함수를 빠져나가면 소멸된다는 특징.
-힙 영역 : 프로그래머가 원하는 시점에 변수를 할당, 소멸하도록 지원하는 영역.



2. 메모리 동적 할당

전역변수와 지역변수로 해결이 되지 않는 상황

//char name[30];
char * userName(void){
char name[30];
gets(name);
return name;
}
int _tmain(int argc, _TCHAR* argv[])
{
char * name1, name2;
name1=userName();
printf("%s\n",name1);
name2=userName();
printf("%s\n",name2);
return 0;
}

함수를 빠져나오면서 userName함수의 name변수 값이 소멸된다.
전역변수로도 main함수의 name1과 name2의 값을 다르게 할 수 없다. 
name1과 name2모두 전역변수 name[30]의 주소값을 가리키기 때문이다. 



3. 힙 영역 메모리 공간 할당과 해제

#include <stdlib.h>
void * malloc(size_t size);       //힙 영역 메모리 할당
void free(void * ptr);             //힙 영역 메모리 해제
-> 성공시 할당된 메모리의 주소 값, 실패 시 NULL

- 위 예제의 해결

userName함수의 return하는 변수만 malloc으로 지정해주면 된다.
char * userName(void){
char * name = (char *)malloc(sizeof(char)*30);
gets(name);
return name;
}



4. calloc 과 realloc


#include <stdlib.h>
void * calloc(size_t elt_count, size_t elt_size);     //개수 , 크기
-> 성공시 할당된 메모리의 주소 값, 실패 시 NULL

malloc(sizeof(int)*10)   == calloc(4,10)   
//같은 크기의 메모리 할당. 대신 'malloc은 쓰레기 값'으로 'calloc은 0'으로 초기화 된다.



#include <stdlib.h>
void * realloc(void * ptr, size_t size);     //
-> 성공시 할당된 메모리의 주소 값, 실패 시 NULL

이미 할당된 메모리 공간 확장시 호출한다.
int * arr (int *)malloc(sizeof(int)*3);
arr = (int *)realloc(sizeof(int)*10);




[11. 매크로와 선행처리기]

-선행처리는 컴파일 이전의 처리이다. 단순 치환 작업만 한다.
  Ex)#define NAME        "홍길동"
      #define AGE           29
      #define PRINT_AR   puts("주소 : 서울\n");
   

1. 매크로 함수

#define MUL(X)      X*X           //매크로 함수
-'가로'를 마구 쳐준다. 위의 예제에서 MUL(5+2)의 결과 값은 49가아니라 17이다.
-두줄에 걸쳐 사용하려면 '/' 이용.
-매크로정의시 먼저 정의된 매크로도 사용가능
-실행 속도가 빠르다.



2. 조건부 컴파일

- #IF 매크로 ~ #ENDIF : 매크로가 참이라면  ~ 실행

Ex)
#define ADD 1
#define MIN 0
int _tmain(int argc, _TCHAR* argv[])
{
int num1,num2;
scanf("%d %d",&num1,&num2);

#if ADD  /*참이라면*/    printf("%d + %d = %d\n",num1,num2,num1+num2);
#endif
#if MIN  /*참이라면*/    printf("%d - %d = %d\n",num1,num2,num1-num2);
#endif
return 0;
}//MIN은 거짓이므로 코드자체가 삭제된다.


- #IFDEF 매크로 ~ #ENDIF : 매크로가 정의되었다면 ~ 실행

- #IFNDEF 매크로 ~ #ENDIF : 매크로가 정의되지 않았다면 ~ 실행

- #ELIF 삽입 : #IF에만 해당
   Ex)
#define ADD   5
int main(void)
{
#if ADD==5
printf("ADD = 5\n");
#elif ADD==6
printf("ADD = 6\n");
#elif ADD==7
printf("ADD = 7\n");
#else 
printf("ADD = 5,6,7이 아니다\n");
#endif
return 0;
}



3. 문자열 내에서 매크로

-문자열은 치환이 안되기에 #연산자를 쓴다.
 Ex)#define STRING_JOB(A,B)    #A "의 직업은 " #B "입니다."

-단순 문자열 결합해서 출력
#define CON(UPP, LOW)    UPP ## 00 ## LOW
int num = CON(22,55);




[12. 파일분할]

파일분할
extern선언 : 외부파일에 변수/함수가 선언되어 있음을 알린다.
static 선언 : static 전역변수는 접근의 범위를 파일의 내부러 제한한다.
                외부파일에서 접근을 허용하지 않는다.




댓글 없음:

댓글 쓰기