C에서 모든 포인터 유형이 void *
을 통해 왕복 할 수 있다는 보장이 있습니까? A
의void *를 통해 모든 포인터를 올바르게 왕복 할 수 있습니까?
typedef struct {
...
} A;
A *p = ...;
void *v = p;
A *p2 = v;
// use p2 here
을 상관없이 유형 :는이 작업에 보장 된 다음과 같은 것이있다
?
C에서 모든 포인터 유형이 void *
을 통해 왕복 할 수 있다는 보장이 있습니까? A
의void *를 통해 모든 포인터를 올바르게 왕복 할 수 있습니까?
typedef struct {
...
} A;
A *p = ...;
void *v = p;
A *p2 = v;
// use p2 here
을 상관없이 유형 :는이 작업에 보장 된 다음과 같은 것이있다
?
개체 포인터는 실제로 void*
을 통해 라운드 트립 될 수 있습니다. C11에서 6.3.2.3 단락 1 :
void에 대한 포인터는 모든 개체 유형에 대한 포인터로 변환되거나 포인터로부터 변환 될 수 있습니다. 어떤 개체 유형이든 에 대한 포인터는 void 포인터와 다시 포인터로 변환 될 수 있습니다. 결과는 이 원래 포인터와 동일한 지 비교합니다.
void 포인터를 어떤 개체 포인터로 변환하고 다시 시작했을 때와 동일한 값이 보장되지 않을 때 반대 방향이 참이 아니라는 것에 유의하십시오.
아니요, 함수 포인터의 참; 그러나, 모든 함수 포인터 유형은 서로 라운드 trippable 위치 : 8 항 말한다 :
하나 개의 타입의 함수에 대한 포인터를 다시 다른 타입의 함수에 대한 포인터로 변환 될 수있다; 결과는 원래 포인터와 동일하게 비교되어야한다. 또한
오브젝트 포인터는 제 7 항에서, 일부 제약에 따라 자신 (무효의 포인터를 포함하지 않음) 중 라운드 trippable 있습니다
는객체 유형에 대한 포인터가 전환 될 수있다 다른 오브젝트 유형을 가리키는 포인터. 결과 포인터가 올바르게 정렬되지 않은 경우 참조 된 유형에 대해 동작이 정의되지 않습니다. 그렇지 않으면 다시 변환 될 때 결과는 원래 포인터와 동일하게 비교됩니다.
개체 포인터 만. 함수 포인터가 아닙니다. –
네, 함수를'void *'로 형변환하지 말고 struct에 포장해야합니다. –