심사문제 59.1 질문있습니다.
, 박 기정님이 작성제가 이 문제를 포인터연산을 이용해서 해결하는 방법외에 배열을 사용해서도 해결할 수 있지 않을까 해서
result1 = (struct Point3D*)ptr[1].x;
result2 = (struct Point3D*)ptr[2].z;
를 답으로 제출해보았는데 에러가 납니다.
그래서 아에 구조체 포인터를 만들어서 주소값을 넣어서 값을 대입했더니
문의한 코드는 삭제합니다.
이건 실행이 되었습니다.
혹시 첫번째 코드에서 에러가 나는 이유를 알 수 있을까요??
(도장_ 관리자님이 수정함 - 원문 제출일: 2020년 1월 17일, 금요일, 오후 6:26)
Re: 심사문제 59.1 질문있습니다.
, 도장_ 관리자님이 작성UNIT 25에서 표 25-1을 보면 연산자 우선순위가 있습니다.
/tmp/100938751/main.c:29:38: error: member reference base type 'void' is not a structure or union result1 = (struct Point3D*)ptr[1].x; ~~~~~~^~
참조하려는 멤버 타입이 void라는 것입니다. 원하는 struct Point3D 구조체로 변환되지 않은 상태입니다. 연산자 우선순위 때문에 그렇습니다.
ptr은 void *입니다.
표 25-1을 보면 우선순위 1이 [] 배열 첨자입니다. 따라서 형변환이 아니라 배열 첨자를 먼저 해석합니다.
표 25-1을 보면 우선순위 2가 (자료형)으로 자료형 변환입니다.
따라서 해당 코드는 void *에 배열 첨자를 사용하는 게 첫 번째입니다.
우선순위를 바꿔 주려면 먼저 처리할 연산을 ()로 묶어줘야 합니다.