C언어 포인터 관련 질문
글쓴이: 박은규@Google / 작성시간: 수, 2019/02/27 - 5:10오후
안녕하세요, 포너블 공부 막 시작한 학부생입니다.
C언어 포인터 관련해서 질문이 있어 글을 쓰게 되었습니다.
/* #1 */ void (*func)() = ...; /* #2 */ /* #3 */ char code[] = "\x31\x42...\x80"; /* #4 */ (void(*)() code)();
1. #1과 같이 선언한다면, 그 의미가
이름이 "func"인 (void *)()형, 즉 void형 함수를 가리키는 포인터를 선언한다.
라는 건가요?
2. #3과 같이 선언했을 때, #4의 의미가
이름이 "code"인 변수를 (void *)()형, 즉 void형 함수로 캐스팅하여 함수처럼 실행한다.
는 것인가요?
Forums:
어느 정도 수준의 답을 바라는 것인지 모르겠네요.
어느 정도 수준의 답을 바라는 것인지 모르겠네요.
미묘하게 부정확한 부분이 있기는 한데 대충 맞습니다.
제 방식대로 풀어보면
void (*func)() = ...;
1. 이름을 찾습니다 => func
2. 가장 가까운 것(우선순위에 의해 먼저 평가 받는 것)을 봅니다 => *니까 포인터네요. func은 포인터입니다.
3. 다음은 ()네요 => 선언에서 포인터까지 읽었으면, 다음 읽는 것은 포인터가 가리키는 대상체입니다. func은 포인터인데, 함수를 가리키네요.
4. 마지막 void입니다. => 선언에서 함수까지 읽었으면, 다음 읽는 것은 리턴타입입니다. func은 포인터인데, 함수를 가리키고, 그 함수의 리턴타입은 void이네요.
정리하면 func은 void를 리턴하는 함수를 가리키는 포인터입니다.
1번에서 이름만 빼면, 타입이 되죠. 2번에서 code를 타입캐스팅 했고, ()는 실행문에서 함수실행을 의미하니 말씀하신 바가 맞습니다.
----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------
감사함다
이해가 잘 되었습니다.
ekpark97.dev@gmail.com
잉??? 제가 모르는 분야인가요?
저 소스코드가 컴파일 되는 컴파일러 옵션이 따로 있는 건가요?
아니면 오래된 버전의 컴파일러?
아하, 잠시 헷갈렸네요.
아하, 잠시 헷갈렸네요.
C언어의 cast operator는 (type) expression의 꼴이어야 하기 때문에 #4는 이렇게 써야 컴파일이 됩니다.
((void(*)()) code)();
댓글 달기