C언어

[C언어] (void *) 포인터란?

_minit 2024. 10. 10. 09:21

(void *)는 특정 데이터 타입에 제한되지 않은 '일반 포인터'입니다. 보통 포인터는 특정 타입을 가리키지만, void *는 어떤 타입의 메모리든 가리킬 수 있는 일종의 만능 포인터라고 생각하면 됩니다. 쉽게 말하면, 이 포인터는 "난 어떤 타입이든 가리킬 수 있어!"라는 느낌입니다.

 

이런 특성 덕분에 void *는 다양한 상황에서 유용합니다. 특히 메모리 할당 함수에서 자주 등장합니다. 예를 들어, malloc() 함수는 동적으로 메모리를 할당하는데, 이때 반환값으로 void * 타입을 리턴합니다. 그 이유는, 이 메모리를 어떻게 사용할지에 따라 타입이 달라질 수 있기 때문입니다.

int *p = (int *)malloc(sizeof(int) * 10);

 

위 코드에서 malloc()은 void *를 반환하는데, 이를 (int *)로 캐스트 해서 사용할 수 있습니다. 이렇게 하면 p는 int 타입 배열을 가리키는 포인터가 됩니다.

 

왜 (void *) 를 사용할까?

  1. 유연성: void *는 어떤 데이터 타입이라도 가리킬 수 있기 때문에, 다양한 타입을 처리해야 하는 함수에서 많이 사용됩니다. 예를 들어, 여러 타입의 데이터를 다루는 라이브러리 함수나 콜백 함수 등에서 매우 유용합니다.
  2. 일반화된 함수 구현: 예를 들어, 연결 리스트를 구현할 때 데이터 타입을 미리 정하지 않고 다양한 타입을 다루기 위해 void *를 사용하면 코드의 재사용성이 높아집니다.

 

(void *) 사용 시 주의사항

  1. 타입 캐스팅 필요: void *는 본래 타입을 알 수 없기 때문에, 사용할 때는 반드시 적절한 타입으로 캐스팅해줘야 합니다. 만약 잘못된 타입으로 캐스팅하면 잘못된 메모리 접근으로 프로그램이 크래시 될 수 있습니다.
  2. 연산 불가: void * 자체로는 어떤 타입인지 알 수 없기 때문에, 포인터 연산(예: ++ 또는 --)을 할 수 없습니다. 따라서 (void *)를 사용할 때는 항상 그 주소를 적절한 타입으로 변환한 다음 연산을 해야 합니다.

 

(void *) 의 활용 예시

메모리 할당 함수에서의 사용

가장 흔한 예시는 malloc() 같은 메모리 할당 함수입니다. 이 함수들은 메모리 블록의 주소를 반환하지만, 이 주소의 타입을 미리 알 수 없으므로 void *를 반환합니다.

char *str = (char *)malloc(50 * sizeof(char));

 

이 코드에서 malloc()은 50바이트의 메모리를 할당하고, 이를 char *로 캐스트해서 문자열을 저장할 공간을 만든 것입니다.

유연성과 일반성을 필요로 하는 상황에서 매우 유용합니다. 물론, 그만큼 타입 캐스팅과 메모리 관리에 주의를 기울여야 합니다.

728x90

'C언어' 카테고리의 다른 글

[C언어] 구조체, 열거형, 공용체란?  (0) 2024.10.10
[C언어] 쉬프트 연산과 비트 연산  (0) 2024.10.10
[C언어] memcpy() 함수  (0) 2024.10.10
[C언어] memset() 함수  (0) 2024.10.10
[C언어] realloc() 함수  (0) 2024.10.08