안녕하세요
하기 코드에 대한 질문이 있습니다.
함수의 값을 반환하는데 함수의 형태가
void getDistance(struct Point2D p1, struct Point2D p2)
를 사용할 경우 에러가 생기는 이유가 뭔지 알수있을까요?
반환값의 printf 출력의 형태가 %f 라서 그런건가요?
보이드는 자동으로 형변환이 된다고 봤는데 포인터가 아니라서 실행이
안되는건지 알수있을까요?
struct Point2D {
int x;
int y;
};
double getDistance(struct Point2D p1, struct Point2D p2)
{
int a = p2.x - p1.x;
int b = p2.y - p1.y;
double c = sqrt(pow(a, 2) + pow(b, 2));
return c;
}
int main()
{
struct Point2D p1;
struct Point2D p2;
scanf("%d %d %d %d", &p1.x, &p1.y, &p2.x, &p2.y);
printf("%f\n", getDistance(p1, p2));
return 0;
}
감사합니다.
void는 맥락에 따라 의미가 다릅니다.
타입에서 void는 타입이 없다는 뜻이므로 %f로 직접 쓸 수 없습니다.
포인터에서 void*는 일반 포인터(general pointer)이므로 타입이 자동으로 변환됩니다.
C 언어에서는
char *ptr = malloc(10);
이와 같이 사용합니다. malloc은 void*를 반환하지만, 자동으로 변환되어 char*에 메모리가 할당됩니다.
같은 문법이 C++ 언에서는 문법 위반입니다. 따라서 이를 피하기 위해
char *ptr = (char*)malloc(10);이와 같이 할당한 이후에 변환을 해줘야 합니다.
Visual C++에서 확장자가 .cpp인 상태이면 C++로 인식하기 때문에 C 언어 방식의 메모리 할당을 사용하면 에러가 발생합니다. 포럼에서도 자주 올라왔던 사항이죠. 확장자를 .c로 바꾸면 해결됩니다.
문의한 내용은 void*와 void의 차이점을 혼동한 것으로 보입니다.