Q & A

효율적인 메모리 할당 크기는 어느 정도 인가요?

오래 전의 컴퓨터나 일부 임베디드 시스템 등 메모리 크기가 작은 플랫폼은 메모리를 할당할 때 2의 배수 크기를 권장했습니다. 하지만 지금은 메모리 크기가 커졌고, 운영체제에서 다양한 알고리즘을 사용하여 메모리를 효율적으로 관리해주므로 이 부분은 크게 신경쓰지 않아도 됩니다. 메모리를 할당한 뒤 해제를 철저히 해주는 것만으로도 충분합니다.

malloc 함수에 음수를 지정하면 어떻게 되나요?

malloc(-4)와 같이 크기를 음수로 지정하면 그냥 NULL이 반환됩니다. 따라서 malloc 함수는 양수만 사용해야 합니다.

const 포인터를 읽는 방법은 무엇인가요?

포인터는 무조건 역순으로 읽으면 쉽습니다.

  • int *: pointer to int
  • int const *: pointer to const int
  • int * const: const pointer to int
  • int const * const: const pointer to const int
  • int ** const: const pointer to pointer to int
  • int * const * const: const pointer to const pointer to int

const pointer는 포인터의 주소가 바뀌지 않는다는 뜻이고, const intint 변수의 값이 바뀌지 않는다는 뜻입니다.

보통은 const int라고 쓰지만, int const도 된다고 했습니다. 그래서 int const * const p;라고 쓰면 p는 const pointer to const int입니다. 이처럼 const의 순서만 바꿔서 역순으로 읽으면 자료형을 쉽게 읽을 수 있습니다.

두 포인터가 같다는 것은 무슨 뜻인가요?

포인터에 저장된 것은 메모리 주소입니다. 특히 메모리 주소도 정수이므로 두 포인터를 비교할 수 있습니다.

int *ptr1;
int *ptr2;

// 생략 ...

if (ptr1 == ptr2) { ... }    // 포인터는 ==로 비교할 수 있음

두 포인터가 서로 같다면 메모리 주소가 같다는 뜻입니다. 이렇게 되면 같은 메모리 공간을 가리키게 되므로 두 포인터를 역참조했을 때의 값도 서로 같습니다.

메모리 주소가 아닌 값을 바로 비교하고 싶다면 포인터를 역참조한 뒤 비교하면 됩니다.

int *ptr1;
int *ptr2;

// 생략 ...

if (*ptr1 == *ptr2) { ... }   // 포인터를 역참조하여 ==로 비교

쓰레기 값은 무엇인가요?

변수, 배열을 선언하거나 메모리를 할당하면 사용이 끝난 메모리를 다시 사용하게 됩니다. 쓰레기 값은 이전에 메모리를 사용할 때 저장된 값을 뜻하며 메모리를 다시 사용하는 시점에서는 필요없는 값이므로 쓰레기 값이라 부릅니다. 따라서 변수, 배열을 선언하거나 메모리를 할당하면 쓰레기 값이 다시 사용되지 않도록 내용을 초기화해야 합니다.