Developer

17(C언어) 동적할당 본문

Programming Language/C

17(C언어) 동적할당

DPhater 2020. 8. 1. 21:33

포인터를 사용해 원하는 시점에 원하는 만큼 메모리를 할당할 수 있는 것을 동적 할당이라고 한다. malloc를 사용해 동적 할당을 할 수 있다. malloc는 stdlib.h헤더에 선언되어 있으므로 stdlib.h를 포함 시켜줘야한다.

#include<stdio.h>
#include<stdlib.h>
int main() {
	int *ptr;
	ptr = (int*)malloc(sizeof(int));
	if (ptr == NULL)return -1;
	*ptr = 32;
	printf("%d", *ptr);
	free(ptr);
	return 0;
}

코드1 실행 결과

코드1을 보면 포인터만 선언되어 있다. 이러한 포인터에 malloc로 int만큼의 크기를 동적 할당해주어 사용하였다.

malloc는 아래와 같이 사용할 수 있다.

malloc(byte단위 크기)

malloc는 void*형이므로 ptr에 맞춰 (int*)으로 형변환 해주었다. 성공하면 메모리 주소를 반환하고 실패하면 NULL을 반환한다. if (ptr == NULL)return -1; 과 같이 메모리 할당에 실패할 경우 예외 처리를 해주는게 좋다.

또한 malloc로 동적 할당해준 메모리는 반드시 free()를 통해서 해제해주어야 한다. 동적할당 하지 않은 일반 변수와 함수들은 모두 스택에 생성된다. 스택에 생성된 변수는 알아서 해제를 해준다. 하지만 동적할당된 변수는 힙 공간에 생성되며 힙에서 할당한 메모리는 직접 해제를 해주어한다.

배열의 동적할당

malloc를 사용하면 프로그램 동작 중 입력받은 크기의 배열을 생성할 수 있다.

#include<stdio.h>
#include<stdlib.h>
int main() {
	int i, size;
	int *ptr;
	scanf("%d", &size);
	ptr = (int*)malloc(sizeof(int) * size);
	if (ptr == NULL)return -1;
	for (i = 0; i < 10; i++)
		scanf("%d", &ptr[i]);
	for (i = 0; i < 10; i++)
		printf("%d ", ptr[i]);
	free(ptr);
	return 0;
}

코드2 실행 결과

배열을 배울때 포인터를 배열처럼 사용할 수 있다고 하였다. 그것을 응용해 ptr에게 (int형 크기)*size 만큼 메모리를 할당해 배열처럼 사용한것이다.

2차원 배열의 동적할당

2차원 배열의 동적할당은 조금 더 번거롭다.

#include<stdio.h>
#include<stdlib.h>
int main() {
	int i, j, row, col;
	int **ptr;
	scanf("%d %d", &row, &col);
	ptr = (int**)malloc(sizeof(int*) * row);
	if (ptr == NULL) return -1;        //예외 처리
	for (i = 0; i < row; i++) {
		ptr[i] = (int*)malloc(sizeof(int) * col);
		if (ptr[i] == NULL)return -1;  //예외 처리
	}
		

	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			scanf("%d", &ptr[i][j]);
		}
	}

	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			printf("%d  ", ptr[i][j]);
		}printf("\n");
	}

	for (i = 0; i < row; i++)
		free(ptr[i]);
	free(ptr);

	return 0;
}

코드3 실행 결과

ptr=(int**)malloc(sizeof(int *)*row)

ptr에게 int*크기를 row만큼 할당해 준다. 이 부분은 포인터 배열을 만들어 주는 것이다. 그리고 반복문을 통해 포인터 배열별로 다시 col만큼 메모리를 할당해주는 것이다. 해제는 역순으로 진행하면된다.

그림을 보면 이해하기 쉬울 것이다.

이중 포인터에 (int 포인터 크기)*row 만큼 동적 메모리를 할당한 그림이다.

ptr은 4개의 포인터를 담을 수 있는 포인터 배열이 되었다. 이제 이 4개의 포인터를 1차원 배열 동적 할당 하는것 처럼 메모리를 할당해 주면된다.

최종적으로 2차원 배열의 동적 할당이 끝났다.

'Programming Language > C' 카테고리의 다른 글

19.(C언어) 문자열 함수  (0) 2020.08.01
18.(C언어) 문자열  (0) 2020.08.01
16.(C언어) 배열  (0) 2020.08.01
15.(C언어) 포인터  (0) 2020.08.01
14.(C언어) 반복문_for,while  (0) 2020.08.01
Comments