2013-12-24 7 views
5

코드가 제대로 작동하더라도 호환되지 않는 포인터 유형 오류 경고가 표시됩니다. 우선, 여기 내 코드의 단순화 된 버전입니다 :C : & (void *) 및 void **가 호환되지 않는 이유는 무엇입니까?

typedef struct { 
    int field1; 
    int field2; 
} my_struct; 

void some_function(void **data){ 
    // do something with *data 
} 

int main(int argc, char *argv[]){ 
    my_struct *ptr = malloc(sizeof(my_struct)); 
    ptr->field1 = 5; 
    ptr->field2 = 17; 
    some_function(&ptr); 
} 

my_struct 유형은 하나의 예이지만, 실제로 그렇게 some_funcvoid**보다는 my_struct**에 동의해야합니다 여러 유형을 사용하고 있습니다. 위의 방법으로 some_func을 호출 할 때마다 다음 경고를 수신하지만 내 코드는 올바르게 작동합니다.

이 유형이 호환되지 않는 이유가 확실하지 않아 어떤 식 으로든 경고를 삭제하려고합니다. 해답이 무엇인지, 가능한 경우 경고를 제거하는 방법을 설명하십시오 (cpp 지시어, 아마도?). 감사!

+0

참고 :이 같은 코드의 조각을 고려 (void* 모든 포인터 타입의 "기본 클래스"처럼 작동). '&'는 형식의 일부가 아닌 연산자입니다. –

+0

@Oli : C에서 의미는 꽤 모호합니다. :) (C++에서는 물론 다른 것을 의미 할 수도 있습니다.) –

+0

'& (void *)'에 의해, 나는'& (some_pointer)'의 결과를 의미했습니다. 빠른 답장을 보내 주셔서 감사합니다 - 방금 C로 시작했습니다. –

답변

4

void*은 (실제로) "유형이 지정되지 않은 메모리 영역에 대한 포인터"를 의미합니다.

void**은 (실제로) "유형이 지정되지 않은 메모리 영역에 대한 포인터를 포함하는 메모리 영역에 대한 포인터"를 의미합니다.

중간에있는 블록의 유형이 void* 인 배열에 주목하십시오. 다른 유형 인 mystruct*의 배열을 효과적으로 전달하고 있습니다. 그래서 컴파일러가 경고합니다.

Similar issues occur in C++ when trying to convert Derived** to Base**; C 언어에서도 마찬가지입니다. '& (무효 *)는'일이 아니라고

void does_things(void** outParameter) 
{ 
    *outParameter = malloc(42); // Looks fine; writing void* to void* :) 
} 

int main() 
{ 
    my_struct* x = /*...*/; 
    does_things(&myStruct); // Ut oh, tries to make x point to 
          // something that is *not* a my_struct 
} 
+0

"void *는 (실제로)"타입이 지정되지 않은 메모리 영역에 대한 포인터를 의미합니다. " - 정말로. 그것은 "포인터에 의해 타입이 지정되지 않은 메모리 영역에 대한 포인터"를 의미합니다. void 포인터에 의해 참조되는 객체는 여전히 선언 된 또는 유효한 유형을 가질 수 있습니다. – davmac

+0

@ davmac : 그것이 내가 "효과적으로"말한 것입니다. 여기에 세부 사항으로 들어가는 것이 대답을 도울 것이라고 생각하지 않았습니다. –

+0

메모리 영역 (또는 "객체")은 'void *'가 가리키고 있기 때문에 형식이 지정되지 않습니다 ("유효"또는 다른 방법). 아마 "효과적으로"아마도 미스 - 사용; 나는 그것이 가치가 있다고 느꼈다. 당신이 의미하는 바는 (void) 포인터가 그것이 가리키고있는 객체 (또는 메모리 영역)의 타입을 나타내지 않는다는 것입니다. 이것은 정확합니다. – davmac

10

void * 매개 변수 유형을 사용하십시오.

void **은 일반 포인터 유형이 아닙니다. void *입니다.

+1

부차적 인 질문으로 :'void ** '는 어떤 의미입니까? 나는. 유용할까요? – Kninnug

+3

@Kninnug 왜 아무 의미도 없습니까? 이것은 포인터를 가리키는 포인터입니다. 그것은 유용 할 때 ... 기다려야 ... 당신은 포인터를 포인터로 놓을 필요가 없습니다. –

+0

아, 빌리 ONeal의 대답은 그 이상으로갑니다. 나는 아마 자러 가야한다. – Kninnug