[c] 포인터와 메모리 관리

프로그래밍에서 포인터는 메모리 주소를 가리키는 변수로, 메모리를 직접 조작하고 사용할 수 있도록 합니다. 포인터는 복잡한 데이터 구조나 메모리의 동적 할당을 위해 필수적입니다. 이번 글에서는 C 프로그래밍 언어에서의 포인터와 메모리 관리에 대해 자세히 알아보겠습니다.

포인터의 기본

C 언어에서 포인터는 * 기호를 이용해 선언하며, 해당 변수의 주소를 저장합니다.

int *ptr;
int num = 5;
ptr = #  // 포인터 ptr은 num의 메모리 주소를 가리킴

포인터 산술

포인터는 추가와 감소 연산이 가능합니다. 이러한 연산을 통해 메모리 주소를 직접 조작할 수 있습니다.

int arr[3] = {10, 20, 30};
int *ptr = arr;

printf("%d", *ptr);  // 10: ptr이 arr의 첫 번째 요소를 가리킴
ptr++;
printf("%d", *ptr);  // 20: ptr이 arr의 두 번째 요소를 가리킴

동적 메모리 할당

malloc() 함수를 사용해 프로그램 실행 중에 필요한 메모리를 동적으로 할당할 수 있습니다.

int *ptr;
ptr = (int *)malloc(5 * sizeof(int));  // int형 데이터 5개를 저장할 수 있는 메모리 동적 할당

메모리 누수와 해제

동적으로 할당한 메모리는 사용 후에 반드시 free() 함수를 이용해 해제해야 합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다.

free(ptr);  // 메모리 해제
ptr = NULL;  // 포인터를 NULL로 초기화하여 dangling pointer 문제를 방지

결론

포인터와 메모리 관리는 C 프로그래밍에서 매우 중요한 주제입니다. 올바르게 사용되면 높은 효율성과 유연성을 제공하지만, 부주의하게 다루면 심각한 버그나 보안 취약점으로 이어질 수 있습니다. 항상 조심해서 다루어야 합니다.