2014-09-09 8 views
0

에 이중 무효 포인터 역 참조 :나는 다음과 같이 약간 보이는 코드이 방법의 int 포인터

int num = 5; 
int *ptr = # 
void **xptr = &ptr; 
printf ("values:%d\n",**(int *)xptr); 

을 할 수없는 이유는 내가하는 int 포인터를 가리키는 무효 이중 포인터 역 참조 ? 아래 두 개의 예제가 작동합니다.

니펫 1

int *ptr = # 
int **xptr = &ptr; 
printf ("values:%d\n",**xptr); 

니핏 2 :

void *ptr = # 
printf ("values:%d\n",*(int *)ptr); 

답변

2

void **void *과 달리 일반 포인터가 아닙니다. 재생할 void ** 값은 실제 void * 값의 주소 여야합니다. 컴파일러는 void **xptr = &ptr;에 대한 경고를 제기한다 : 더 자세한 설명은

int num = 5; 
void *ptr = # 
void **xptr = &ptr; 
printf ("values:%d\n", *((int *)*xptr)); 

을 다음과 같이

[Warning] initialization from incompatible pointer type [enabled by default] 

당신은 그것을 할 수 있습니다, comp.lang.c FAQ list · Question 4.9를 참조하십시오.

+0

, 예 void ** xptr = & ptr.Thanks에 대해 void ** 값이 int 또는 char의 주소 대신 void * 주소 여야한다는 것을 나타내는 경고가 생성되었습니다. 'voidPointer.c : 6 : 19 : 경고 : 호환되지 않는 포인터 유형에서 초기화 됨 [기본적으로 사용 가능] void ** xptr = &ptr;' – hmmm

+0

Q4.9가 정말로 내 질문에 대한 답변입니다. – hmmm

2

용액 양쪽 모두 asterics을 사용하는 것이다.

printf ("values:%d\n",**(int **)xptr); 

왜? 그렇지 않으면 컴파일러에게 실제로 수행중인 작업에 대한 잘못된 정보를 제공하기 때문입니다. C 스타일의 캐스트는 모든 것을 컴파일하도록 강요받을 수 있지만, 컴파일러가 무언가를하도록 강요한다면 아마도 크래시 코드를 생성한다고 비난하지 말고 스스로를 알아야합니다.

컴파일러에서 경고를 생성하지 않는지 궁금합니다. 너와 그 경고를 무시 했니?

초기화가 xptr 일 가능성이 높습니다. haccks here에서 게시물을 참조하십시오.

+0

내 downvote. 'void ** xptr = &ptr;'은 OP의 코드 스 니펫에서 의미가 없습니다. 'printf ("값 : % d \ n", ** (int **) xptr);을 제안하는 것은 잘못되었습니다. – haccks

+0

내가 맞으면이 해결책은 잘못이 아닙니다. ''xptr''을 얻기위한 그의 초기화가 잘못되었을 수도 있습니다. –

+0

그러면 잘못된 것으로 간주됩니다. – haccks