2010-02-05 3 views
4

컴파일러에서 folowing에 대해 불평하고 있습니다 (경고).무효로 변환 **이 필요합니까?

내가 누락 된 항목이 있습니까?

호환되지 않는 포인터 유형에서 'FUNC' 의 인수 하나를 전달 :이이

int func(void** ptr); 

컴파일러 경고 같이 정의 FUNC와 캐스팅

char* CurrentCh = some ptr value; 
int size; 

size = func(&CurrentCh); 

필요하지 않았다 생각하기 때문에

thx

+0

'func (void * ptr);을 가질 수없고'func (CurrentCh);와 같이 전달할 수있는 특별한 이유가 있을까요? – ezod

답변

7

C에서는 void *가 필요한 함수에 모든 포인터 유형을 전달할 수 있습니다. 그것이 말하는 것은 "나는 포인터가 필요합니다. 포인터가 가리키는 것이 중요하지 않습니다." 반면 void **는 "다른 포인터 유형에 대한 포인터가 아닌 void *에 대한 포인터가 필요합니다"라고 말합니다.

+0

맞습니다. 함수 선언은 'void 포인터'가 아니라 'void 포인터'를 특별히 요구합니다. func (void * ptr)로 변경하면 제대로 작동합니다. 나는 포인터의 배열이 아니라면 왜 포인터에 포인터를 원하는지 의아해 할 필요가있다. –

+0

ptr이 "return parameter"가되기를 원하기 때문에 CurrentChat이 호출 후에 다른 것을 가리킬 것으로 기대합니다. 나는 그것을 잘못하고있다. (내 실제 함수에는 이미 반환 매개 변수가 있습니다). – matkas

+0

그러면 포인터 하나만 있으면되고 원하는 유형으로 캐스팅해야합니다. – scooterman

0

C에서 모든 포인터는 void *로 다운 캐스트 될 수 있지만 void가 될 수는 없습니다 **. 명시 적 캐스트가 필요합니다.

4

C에서 void *은 일반적인 포인터 유형입니다. 그러나 void **은 일반적인 포인터 대 포인터 유형이 아닙니다! 당신은 일반적인 방법으로 포인터에 대한 포인터를 통과 할 수 있도록하려면, 당신은 어쨌든 void *를 사용해야합니다

#include <stdio.h> 

void func(void *ptr) 
{ 
    char **actual = ptr; 
    const char *data = *actual; 
    printf("%s\n", data); 
} 

int main(void) 
{ 
    char *test = "Hello, world"; 
    func(&test); 
    return 0; 
} 
+0

괜찮지 만, ptr을 반환 매개 변수로 가정하는 "func"정의에서는 명확하지 않습니다. – matkas

+0

@matkas : 예, 내가 한 일을하거나 func()을'func (char ** ptr)'로 선언 할 수 있습니다. –

3

캐스팅 필요한 것을 당신이하는 타입 말장난의 한 형태이기 때문에 : 당신은 메모리를 재 해석 char *에서 void *으로 지정됩니다.

이러한 유형의 경우 C 표준은 실제로 이것이 char *void *이 같은 표현으로 작동한다는 것을 보증합니다. 다른 유형 조합의 경우에는 그렇지 않을 수 있습니다.

표준의 관련 부분은 섹션 6.2.5이다 §27

동일한 표현 배향 캐릭터 타입에 대한 포인터 요구를 무효화한다 포인터. 마찬가지로 호환 가능 유형의 은 정규화되거나 정규화되지 않은 버전 에 과 동일한 표현 및 정렬 요구 사항을 가져야합니다. 구조 유형에 대한 모든 포인터는 동일하게 표현 및 정렬 서로를 가져야합니다. 모든 유니온 유형에 대한 포인터는 동일한 표현과 서로 을 필요로합니다. 포인터 다른 유형으로 동일한 표현 또는 맞춤 요구 사항이 필요하지 않습니다.

및 관련성이 낮은 (그러나 흥미로울 수도 있음) 섹션 6.3.2.(3)는 개체 또는 불완전 유형 §7

포인터 다른 개체 또는 불완전한 형태의 포인터로 변환 될 수있다. 결과 포인터가 이 가리키는 포인터가 유형으로 올바르게 정렬되어 있지 않으면 동작이 정의되지 않습니다. 그렇지 않으면 다시 변환 할 때 결과는 원래 포인터와 같아야합니다. 개체에 대한 포인터를 문자 유형에 대한 포인터로 변환하면 결과는 개체의 가장 낮은 주소 바이트 인 을 가리 킵니다. 결과가 연속적으로 증가하면 개체의 크기까지 은 개체의 나머지 바이트 에 대한 포인터를 생성합니다.

그 밖의 것은 구현에 따라 다릅니다.

관련 문제