2017-02-17 15 views
1

C에서 모든 포인터 유형이 void *을 통해 왕복 할 수 있다는 보장이 있습니까? Avoid *를 통해 모든 포인터를 올바르게 왕복 할 수 있습니까?

typedef struct { 
... 
} A; 

A *p = ...; 
void *v = p; 
A *p2 = v; 
// use p2 here 

을 상관없이 유형 :는이 작업에 보장 된 다음과 같은 것이있다

?

+3

개체 포인터 만. 함수 포인터가 아닙니다. –

+0

네, 함수를'void *'로 형변환하지 말고 struct에 포장해야합니다. –

답변

5

개체 포인터는 실제로 void*을 통해 라운드 트립 될 수 있습니다. C11에서 6.3.2.3 단락 1 :

void에 대한 포인터는 모든 개체 유형에 대한 포인터로 변환되거나 포인터로부터 변환 될 수 있습니다. 어떤 개체 유형이든 에 대한 포인터는 void 포인터와 다시 포인터로 변환 될 수 있습니다. 결과는 이 원래 포인터와 동일한 지 비교합니다.

void 포인터를 어떤 개체 포인터로 변환하고 다시 시작했을 때와 동일한 값이 보장되지 않을 때 반대 방향이 참이 아니라는 것에 유의하십시오.

아니요, 함수 포인터의 참; 그러나, 모든 함수 포인터 유형은 서로 라운드 trippable 위치 : 8 항 말한다 :

하나 개의 타입의 함수에 대한 포인터를 다시 다른 타입의 함수에 대한 포인터로 변환 될 수있다; 결과는 원래 포인터와 동일하게 비교되어야한다. 또한

오브젝트 포인터는 제 7 항에서, 일부 제약에 따라 자신 (무효의 포인터를 포함하지 않음) 중 라운드 trippable 있습니다

객체 유형에 대한 포인터가 전환 될 수있다 다른 오브젝트 유형을 가리키는 포인터. 결과 포인터가 올바르게 정렬되지 않은 경우 참조 된 유형에 대해 동작이 정의되지 않습니다. 그렇지 않으면 다시 변환 될 때 결과는 원래 포인터와 동일하게 비교됩니다.

+0

'void * '를 통해 round-tripping하면 _same_ bit-pattern 포인터 일 필요는없는 등가 포인터가 생성됩니다. IAC, OP는 동등한 액세스에만 관심이있는 것 같습니다. – chux

+0

모든 유형의 포인터는 다른 유형으로 변환 될 수 있으며, 정렬을 위반하지 않는 한 원래의 포인터와 동일하게 비교됩니다. – 2501

+0

@ 2501 : 표창장이 필요합니다. –