2015-01-09 2 views
1

함수 포인터를 선언 할 때 읽는 한, 왼쪽 또는 오른쪽에 할당이 없습니다. 하지만 C 소스 파일에 여러 함수 포인터를 가지고 모두가 아래와 같이 할당 형태로 사용됩니다C 함수 포인터 할당

void (*pbindRemoveDev)(zAddrType_t *Addr) = (void*)NULL; 

아무도 날 (무효 *) NULL 부분을 이해하는 데 도움이 수 있습니까?

이것은 임베디드 코드입니다.

int a; 

을 그러나 여기 유형은 다음과 같습니다 :

+1

는 * 함수 선언에 대한 초기화 구문이 없다 : 아래

는 함수 포인터 초기화 예입니다. 그러나 포인터 * 변수는 항상 초기화 할 수 있습니다. – jxh

+0

함수 __pointer__는 함수 __definition__ (또는 프로토 타입 선언)과 다릅니다. –

+3

도대체 누가'NULL'을'void * '로 던집니까? C에서는 완전히 중복되어 있습니다 ('NULL'은 이미 무효 포인터입니다). C++에서는 캐스트가 void 포인터에서 다른 포인터로의 암시 적 변환이 없으므로 캐스트가 중단됩니다. – delnan

답변

2

이 정확히 같다

void (*)(zAddrType_t*) 

그래서 그래, 당신이 int a = 0;

5

을 할 수

void (*pbindRemoveDev)(zAddrType_t *Addr) = (void*)NULL; 
에는 할당은 없습니다

이니셜입니다. zing 기능 포인터 pbindRemoveDev to NULL. 다음은 과제입니다

void RemoveDev(zAddrType_t *Addr); 
pbindRemoveDev = RemoveDev // Assignment 
+1

1+이 * initilaisation *이며 * assignmet *과 다른 점을 지적하기 위해 1+. – alk

+0

할당을 사용하는 버전이 여전히 작동하고 동등한 방식으로 작동하기 때문에 그 점 이외에는 약간의 문제가 있습니다. 당신이 함수 포인터를 할당 할 수 없다는 OP의 가정은 단순히 거짓입니다. – sepp2k

1

함수 포인터 선언입니다. 귀하의 코드는 그것을 NULL로 초기화합니다. 당신이 기능을 사용하면 메모리 주소를 NULL로 가리키고 있기 때문에이 충돌합니다 포인터를 호출하면 사용중인 컴파일러

void (*pbindRemoveDev)(zAddrType_t *Addr) = (void*)NULL; 

모른 적절한 initializationn는

void (*pbindRemoveDev)(zAddrType_t *Addr) = NULL; 

을 수 있습니다. *

#include <stdio.h> 

void bar(int x) 
{ 
     printf("%d\n", x); 
} 

int main() 
{ 

     void (*foo)(int) = &bar; 
     foo(10); //This prints 10. 

     return 0; 
} 
+0

정확성 유지 : 이것은 함수 포인터'Addr '의 * 선언 *뿐 아니라 * 정의입니다. – alk