C 프로그래밍 - 12주차 : 고급 포인터
메모리 할당 함수
동적 메모리
-
프로그램 실행 시에 필요한 메모리가 변경된다면, 정적으로 할당해 둔 크기가 부족하거나 너무 많이 남을 수 있음 ⇒ 메모리 낭비 문제가 발생
-
따라서 필요할 때 마다 할당하는 동적 메모리 할당으로 해결함
-
HEAP 영역에 메모리를 할당함
-
malloc() 함수를 사용함 (malloc.h 헤더파일에 있음)
-
포인터 변수 = (포인터 변수의 데이터형*) malloc(포인터 변수의 데이터형 크기 * 필요한 크기)
// malloc() 예시
int* p;
p = (int*)malloc(sizeof(int) * 3); // 필요한 크기가 3인 예시
- malloc() 함수 사용 후에는 사용 종료를 운영체제에 알려야 함.
- free() 함수를 사용함. 포인터 변수에 null을 넣는다는 의미
- malloc() 함수에 (포인터 변수 데이터형*) 이 붙는 이유는, malloc() 자체의 반환값은 void* 이기 때문이다. 단순히 메모리만 할당해서 돌려준다.
- calloc() : 0으로 초기화 된 메모리를 확보
- realloc() : 최초로 확보한 메모리의 크기를 변경
- ex. p = (int*) realloc(p, sizeof(int) * 10)
포인터 배열
- 배열 요소로 포인터 변수를 가지는 배열
char test[100] = "program";
배열 크기를 크게 잡아놓고 안쓰면 손해. 단점 보완을 위해 포인터 + 동적메모리 사용하는 예시
char* p[3];
char imsi[100];
int i, size;
for(i = 0; i < 3; i++){
gets(imsi); // 임시 배열에 입력받고
size = strlen(imsi); // 크기 구해서
p[i] = (char*) malloc((sizeof(char)) * size) + 1 // \0 문자 고려해서 크기 + 1만큼 동적할당
strcpy(p[i], imsi)
}
for(i = 0; i < 3; i++) {
free(p[i]); // 할당 취소
}
이중 포인터
- 포인터의 포인터
- 참조 연산자 * 를 두 번 사용함
void 포인터
- 데이터 타입이 명시되어 있지 않고, 주소값 저장 용도로만 사용되는 포인터
- 범용 포인터 : 자료형이 정해지지 않은 특성 때문에 어떤 자료형으로 된 포인터든 모두 저장 가능함
- 역참조 및 포인터 연산 시에는 사용하고자 하는 타입으로 명시적 타입 변환 (타입명*) 필요
아래는 공부할 때 적은 내용