programing

((보이드(*)0x1000)();'는 무슨 뜻입니까?

lastmoon 2023. 7. 26. 22:19
반응형

((보이드(*)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

반응형