((보이드(*)0x1000)();'는 무슨 뜻입니까?
프로그램 카운터를 주소로 점프하도록 설정하는 것이 목적인 코드가 있습니다.0x1000
나는 그것이 무엇을 하는지 알지만 어떻게 하는지 이해하지 못합니다.그것은 제가 C 언어 지식이 부족한 것과 관련이 있습니다.당신이 나를 깨우쳐 줄 수 있을지도 모릅니다.문/함수는 여기에 있습니다(나는 그것이 무엇인지도 모릅니다 :).
((void (*)())0x1000)();
반환되는 함수에 대한 포인터인 것 같습니다.void
그리고 논쟁을 받아들이지 않습니다.제가 틀렸다면 고쳐주세요.
C
선언은 간단한 규칙을 사용하여 내부에서 외부로 디코딩됩니다. 식별자에서 시작하여 오른쪽에서 확인합니다.[]
(어레이) 또는()
(function) 그런 다음 왼쪽에서 괄호를 교차하지 않고 값의 유형(어레이에 표시되거나 함수에 의해 반환됨)을 확인하고 괄호에서 벗어나 반복합니다.
예:
void (*p)()
p
아무 것도 반환하지 않는 함수(오른쪽)에 대한 포인터(왼쪽, 괄호를 교차하지 않음)입니다(괄호를 이동하고 다음 수준을 읽음).
식별자(p
이 경우)가 누락되어 형식 선언만 남았습니다.
괄호 안에 포함된 유형으로, 값 앞에 배치된 유형은 유형 캐스트입니다.
(void (*)())0x1000
숫자를 변환합니다.0x1000
아무것도 반환하지 않는 함수에 대한 포인터(의 선언에 대한 단락의 괄호 밖의 내용 참조)p
상기).
다음 단계에서는 위의 표현식(함수에 대한 포인터를 함수 이름과 동일한 방식으로 사용할 수 있음)을 사용하여 가리키는 코드를 실행합니다.
분해된 전체 표현식 아래를 참조하십시오.
(
(
void (*)() /* type: pointer to function that doesn't return anything */
)0x1000 /* value 0x1000 treated as a value of the type declared above */
) /* enclose in parentheses to specify the order of evaluation */
(); /* the pointer above used as a function name to run the code */
(void (*)())
반환되는 함수에 대한 포인터입니다.void
그리고 지정되지 않았지만 고정된 수의 인수를 사용합니다.
(void (*)())0x1000
문자 그대로를 주조하는 것입니다.0x1000
이상의 종류로
마지막으로, 접미사는()
함수 호출입니다.앞에 있는 식은 괄호 안에 있어야 합니다. 그렇지 않으면 접미사가 붙습니다.()
에 바인딩됩니다.0x1000
구문적으로 유효하지 않습니다.
캐스팅이 실제로 유효한지 확인하는 것은 당신에게 달려 있습니다.그렇지 않으면 프로그램의 동작이 정의되지 않습니다.
상수
0x1000
유형으로 캐스팅됨:
(type)0x1000
은 종는류입니다.void (*)()
지정되지 않은 수의 매개 변수(오른쪽의 빈 괄호)를 사용하고 값을 반환하지 않는 함수에 대한 포인터(아래쪽)void
별표에 를 추가하면 별표와 연결되지 .void
잘못 생성될 수 있습니다.void *
여기에 입력합니다.
캐스트 후 0x1000 주소에 매개 변수가 없는 보이드 함수에 대한 포인터가 표시됩니다.
(void (*)())0x1000
그리고 그 기능은...
((void (*)())0x1000)
빈 매개 변수 목록을 추가하여 호출됩니다.
((void (*)())0x1000)()
마지막으로, 마지막에 추가된 세미콜론은 이 함수 호출 식을 완전한 명령어로 변환합니다.
((void (*)())0x1000)();
해당 코드를 작성한 사용자는 다음과 같이 읽기 쉬운 방식으로 다시 작성했어야 합니다.
#define ADDRESS_OF_FUNCTION_X 0x1000
typedef void (*func_ptr_t)(void);
...
func_ptr_t function_x = (func_ptr_t)ADDRESS_OF_FUNCTION_X;
function_x();
코드가 하는 일은 이제 거의 자기 문서화되어 있습니다.
언급URL : https://stackoverflow.com/questions/30345445/what-does-void-0x1000-mean
'programing' 카테고리의 다른 글
왜 이 "Hello, World!" 자바스크립트 코드 조각이 허용 가능한 프로그램 명령어로 인식됩니까? (0) | 2023.07.26 |
---|---|
PARTITION BY 1은 무엇을 의미합니까? (0) | 2023.07.26 |
JSON을 쓸 수 없습니다. 역할 컬렉션을 게으르게 초기화하지 못했습니다. (0) | 2023.07.26 |
MariaDB 커넥터 vs MySQLDB 커넥터 - 트랜잭션 문제 (0) | 2023.07.21 |
스프링 부트를 사용하여 Zuul에 대한 디버그 정보를 보려면 어떻게 해야 합니까? (0) | 2023.07.21 |