메모리 할당은 두 가지 방법으로 구현됩니다. 정적 메모리 할당(static memory allocation)은 컴파일 타임에 메모리를 할당하는 것이며, 동적 메모리 할당(dynamic memory allocation)은 런타임에 메모리를 할당하는 것입니다.
동적 메모리 할당은 프로그램 실행 중에 메모리를 할당하는 것이므로, 메모리가 필요한 시점에 할당할 수 있습니다. 메모리를 할당하는 함수는 malloc()입니다. 이 함수는 인자로 할당하고자 하는 메모리의 크기를 받으며, 메모리를 할당한 후에는 할당된 메모리 블록의 시작 주소를 반환합니다.
메모리를 할당한 후에는 해제하는 것이 필요합니다. 동적으로 할당된 메모리는 반드시 프로그램에서 해제되어야 합니다. 이를 위해 사용되는 함수는 free()입니다. 이 함수는 인자로 할당된 메모리 블록의 시작 주소를 받으며, 해당 메모리 블록을 해제합니다.
동적 메모리 할당을 사용하면, 프로그램 실행 중에 필요한 만큼 메모리를 할당할 수 있으므로, 프로그램이 더 효율적으로 동작할 수 있습니다. 또한, 동적 메모리 할당은 프로그램이 더 유연하게 동작할 수 있도록 합니다.
메모리를 동적으로 할당하는 방법은 malloc() 함수를 사용하는 것입니다. malloc() 함수는 미리 정해진 크기의 메모리 블록을 할당하고, 해당 블록의 시작 주소를 반환합니다.
malloc() 함수의 구문은 다음과 같습니다.
void* malloc(size_t size);
여기서 size는 할당하고자 하는 메모리 블록의 크기를 바이트 단위로 나타냅니다. void*는 반환되는 포인터의 자료형으로, 반환된 주소를 가리키는 포인터 변수에 대입됩니다.
아래는 동적할당을 사용하는 간단한 예시입니다. 이 예시에서는 malloc() 함수를 사용하여 문자열을 저장하는 메모리 블록을 동적으로 할당합니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
char* str;
str = (char*) malloc(15 * sizeof(char));
if(str == NULL) {
printf("메모리 할당에 실패했습니다.\n");
exit(1);
}
strcpy(str, "Hello, world!");
printf("문자열: %s\n", str);
free(str);
return 0;
}
위 코드에서는 문자열을 저장하기 위해 char 자료형의 포인터 변수 str을 선언합니다. 그리고 malloc() 함수를 사용하여 15 바이트의 메모리 블록을 할당합니다. malloc() 함수가 반환하는 포인터를 str에 대입하여 문자열을 저장합니다.
또한, malloc() 함수가 NULL 포인터를 반환할 수도 있으므로, if(str == NULL) 구문을 사용하여 메모리 할당이 실패한 경우 에러 메시지를 출력하고 프로그램을 종료합니다.
마지막으로, 동적으로 할당된 메모리를 반환하기 위해 free() 함수를 사용합니다. free() 함수는 동적으로 할당된 메모리 블록의 시작 주소를 인자로 받아 해당 메모리를 해제합니다.
동적할당에 대해 공부하면서 어려웠던 점 입니다
할당된 메모리의 해제: 동적으로 할당된 메모리는 반드시 해제되어야 합니다. 그렇지 않으면 메모리 누수(memory leak)가 발생하여 시스템 자원을 소모하게 됩니다. 따라서 메모리 할당 이후, 해당 메모리를 해제하는 방법에 대해서도 이해해야 합니다.
포인터 사용: 동적할당을 위해서는 포인터 개념을 이해해야 합니다. 포인터는 메모리 주소를 저장하는 변수이며, 동적할당된 메모리를 사용하기 위해서는 해당 메모리의 주소를 포인터에 저장해야 합니다. 포인터 사용에 익숙하지 않은 경우에는 포인터 연산 및 주소값의 이해가 어려울 수 있습니다.
메모리 관리: 동적할당된 메모리는 언제든지 해제될 수 있기 때문에, 메모리의 안정적인 관리가 필요합니다. 메모리 블록들의 크기 및 위치 등을 관리하는 방법에 대해서 이해해야 하며, 메모리 블록이 중복되거나 누락되지 않도록 관리해야 합니다.
예외 처리: 동적할당은 메모리 할당에 대한 예외 처리가 필요합니다. 메모리 할당이 실패할 경우에 대한 처리 방법을 정의해야 하며, 이러한 예외 상황에 대해 대처할 수 있는 기술적인 능력이 필요합니다.
위와 같은 어려움을 극복하고자, 동적할당에 대한 개념을 이해하는 것 뿐만 아니라, 포인터의 사용 및 메모리 관리에 대한 실습을 수행하며 경험을 쌓아가는 것이 중요한거 같습니다.
동적할당은 프로그래밍에서 매우 중요한 개념 중 하나입니다. 이를 통해 프로그램에서 필요한 메모리를 할당하고 사용할 수 있습니다.
동적할당을 사용하면 프로그램에서 사용할 메모리의 크기를 미리 예측하지 않아도 됩니다. 또한, 동적할당된 메모리는 필요하지 않을 때 해제할 수 있기 때문에 프로그램의 메모리 사용량을 효율적으로 관리할 수 있습니다.
하지만, 동적할당을 사용할 때 주의할 점도 있습니다. 예를 들어, 동적할당된 메모리를 해제하지 않으면 메모리 누수(memory leak)가 발생할 수 있습니다. 따라서, 메모리를 할당할 때는 항상 해제하는 것을 습관화하는 것이 좋습니다.
동적할당은 C언어에서 매우 중요한 개념 중 하나이며, C언어를 비롯한 많은 프로그래밍 언어에서 사용됩니다. 이를 잘 이해하고 사용할 수 있다면 프로그래밍에 있어서 더욱 유연하고 효율적인 코드를 작성할 수 있을 것입니다.