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
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;
}
-문자열은 치환이 안되기에 #연산자를 쓴다.
Ex)#define STRING_JOB(A,B) #A "의 직업은 " #B "입니다."
-단순 문자열 결합해서 출력
#define CON(UPP, LOW) UPP ## 00 ## LOW
int num = CON(22,55);
[12. 파일분할]
파일분할
extern선언 : 외부파일에 변수/함수가 선언되어 있음을 알린다.
static 선언 : static 전역변수는 접근의 범위를 파일의 내부러 제한한다.
외부파일에서 접근을 허용하지 않는다.
댓글 없음:
댓글 쓰기