void에 알아보자
void는 형이 없다는 것을 보통 의미하며 main함수에서 보통 아래와 같이 사용되기도 한다.
int main () {
return 0;
}
// or
int main(void) {
return 0;
}
void는 int x = 4;처럼 void x = 4;는 되지 않고 오로지 포인터로만 사용된다.
int x = 5;
void* xp = &x;
하지만 위에서 선언한 xp변수는 x를 int로 읽을지, float으로 읽을지 알 수 없다.
그렇기 때문에 printf할 수도 없고, 배열처럼 *(xp + 1) 메모리 증가도 할 수 없다.
그렇다면 왜 이런 녀석이 등장했을까?
이유는 malloc와 free처럼 내부에 어떤 변수형이든 사용하기 위함이다.
int x = (int*)malloc(sizeof(int)*3);
free x;
위와 같이 동적할당하는 경우, malloc은 크기를 할당하지만 int로 캐스팅해주고, 만약 float이였다면 float*으로 캐스팅 해주었을 것이다. 이처럼, malloc은 void 포인터를 리턴하기 때문에 따로 캐스팅이 필요하다.
반대로, free 함수는 어떤 변수형의 포인터도 인자로 받기 위해 void 포인터를 인자로 받게 된다.