동적 메모리 할당이란?

KIM SOO MIN·2023년 12월 11일

learning

목록 보기
11/16
💡 일단 이전 포스팅인 포인터에서 벗어나서 기분이 매우 좋다. 이 좋은 기분으로 동적 메모리 할당에 대해서 알아보기로 하자.

동적 메모리 할당이란?

C언어에서 배열의 경우 사전에 적절한 크기만큼 할당해주어야 한다.

원하는 만큼만 메모리를 할당해서 사용하고자 한다면 프로그램 실행 도중에 메모리를 할당하는 방법인 동적 메모리 할당을 사용한다.

동적으로 할당된 변수는 힙 영역에 저장된다.

동적 메모리 할당 함수

  • malloc() 함수를 이용해 원하는 만큼의 메모리 공간을 확보할 수 있다.
  • malloc() 함수는 메모리 할당에 성공하면 주소를 반환하고, 그렇지 않으면 NULL을 반환한다.
  • malloc() 함수는 <stdlib.h> 라이브러리에 정의되어 있다.
  • free() 함수로 메모리 해제를 해주어야 메모리 내의 프로세스 무게가 더해져 오류가 발생하지 않는다.

동적으로 문자열 처리하기

  • 일괄적인 범위의 메모리를 모두 특정한 값으로 설정하기 위해서는 memset() 을 사용한다.
    • memset(포인터, 값, 표기);
  • 한 바이트씩 값을 저장하므로 문자열 배열의 처리 방식과 흡사하다.
  • memset() 함수는 <string.h> 라이브러리에 정의되어있다.

예제

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
	char *a = malloc(100);
	memset(a, 'A', 100);
	for(int i = 0 ; i < 100 ; i++) {
		printf("%c ", a[i]);   // A 100번 출력
	}

	return 0;
}
#include <stdio.h>
#include <stdlib.h>

int main(void) {
	int** p = (int**)malloc(sizeof(int*) * 3); // int** p로 이차원 배열을 만들어주고 3행을 만들어준다.
	
	for(int i = 0 ; i < 3 ; i++) {
		*(p+1) = (int*)malloc(sizeof(int) * 3); // 3열을 만들어 준다.
	}
	
	for(int i = 0 ; i < 3 ; i++) {
		for(int j = 0 ; j < 3 ; j++) {
			*(*p+i)+j) = i*3+j;
			printf("%d ", *(*p+i)+j);
		}
		printf("\n");
	}
}

/*
0 1 2
3 4 5
6 7 8
*/

마치며..

배열의 사이즈를 미리 정하지 않아도 된다는 점에서 좋은 것 같다. (JavaScript는 원래 없지만..)

아직도 포인터랑 이차원 배열 함께 쓰는 것은 어렵지만 어려우면 다시 보고 또 다시 보고 이해하는 수밖에 없지 않을까 하는 생각이 든다.

참고한 자료들

https://fastcampus.co.kr/courses/201582/clips/

profile
3년차 풀스택 엔지니어입니다.

0개의 댓글