2010-04-09 3 views
6

그들은이 표현은 C에서 유효하고, 함수 호출을 의미했다 :암호문을 해독 (* (무효 (*)()) 0)()

(*(void(*)())0)(); 

사람이 명확하게 설명 할 수 무엇이 표현 수단 ?

나는 이것을 컴파일하려고 시도했는데 오류가 발생하지 않았다는 것에 놀랐다.

+2

이 기능을 숨겨진 기능이라고 불러야합니다. –

+0

"정의되지 않은 동작은 아닙니다 ... 기능입니다!". 아니요, 정의되지 않은 동작입니다. –

답변

18

단계 : 코드는 동작이 보증되지

void(*)()  // a pointer-to-function type, taking unspecified parameters 
        // and returning nothing. 
    (void(*)())0  // a null pointer of that pointer-to-function type 
(*(void(*)())0)  // dereference that pointer 
(*(void(*)())0)(); // and call it with no parameters 

, 그것은거야 어떤 종류의 불법적 인 접근/segfault로 아마 충돌합니다.

+0

@Steve Jessop : 답변을 주셔서 감사합니다 – NguyenDat

+2

실제로 코드는 컴파일 할 플랫폼에 따라 특정 동작을합니다. 일부 플랫폼에서는 명확하게 정의되고 다른 플랫폼에서는 불법입니다. 나는 최근에 마이크로 컨트롤러를 구입했고 활성화되었을 때 메모리의 주소 0에서 시작하는 코드를 실행합니다. 그래서 그 코드는 프로그램의 시작 부분으로 뛰어들 것입니다. – Ponkadoodle

+2

오른쪽, 그 마이크로 컨트롤러는 단지 * 아마도 * 충돌을 의미하는 경우 중 하나입니다 - nguyendat이 낮은 플랫폼을 사용하지 않을 확률 ;-) 물론 "정의되지 않은 동작"이라고 말할 때 , 언제나처럼, C 표준에 의해 정의되지 않았다. 특정 구현은 정의되지 않은 동작의 특정 경우에 수행 할 작업을 보장 할 수 있습니다. –

6

함수에 대한 포인터를 작성한 후 호출하는 중입니다. 숨겨진 기능이지만 정의되지 않은 동작이라고하지는 않습니다.

은 기본적으로 당신은이 일을 대신 주소 0됩니다

void test() { } 

void(*pfn)() = test; 
(*pfn)(); 
3

그것은 NULL에서 함수에 대한 포인터입니다.

void(*)()은 아무 것도 반환하지 않는 args를 취하는 함수에 대한 포인터의 정의입니다. 당신은 그것을 이름을 지정할 수 있습니다 :

typedef void(*my_func)(); 

은 다음의 예에서 당신은 캐스트를 가지고 :

(my_func)0my_func에 함수 포인터를 산출, 즉, 함수가 아무것도 복용하지 아무것도 반환하지 않습니다.

그런 다음 앞에 오는 별표 (불필요한 afaik)를 사용하여 역 참조하고 전화를 겁니다.

그래서 인자를 취하지 않고 아무 것도 반환하지 않고 주소 0에 살고있는 함수를 호출하고 있습니다.

이것은 (일반적으로) 정의되지 않은 동작이며 많은 플랫폼에서 즉시 충돌합니다. (당신은 내가 그것을 생각하지 것이다 적어도, 주소 제로 기능을 넣을 경우 정의되지 않은 동작하지 않습니다.) 단계로

2

괄호 안에 표시하십시오.

마지막 ()은 매개 변수가없는 함수를 나타냅니다.

(void(*)())은 void를 반환하는 함수입니다.

마지막 조금, 처음에 (*0)는 도대체에 놓여 어떤 호출, 함수의 주소가 0

그래서 기본적으로 포인터 위치에서 거짓말을 호출하는 컴파일러를 말하고있다 매개 변수없이 0 번지를 지정하십시오. 보통은 안전하지 않습니다. 임베디드 환경에서

0

은 시스템 재설정 루틴을 호출하는 방법 일 수 있습니다.

관련 문제