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 포인터

  • 데이터 타입이 명시되어 있지 않고, 주소값 저장 용도로만 사용되는 포인터
  • 범용 포인터 : 자료형이 정해지지 않은 특성 때문에 어떤 자료형으로 된 포인터든 모두 저장 가능함
  • 역참조 및 포인터 연산 시에는 사용하고자 하는 타입으로 명시적 타입 변환 (타입명*) 필요

아래는 공부할 때 적은 내용