2015-01-13 4 views
1

매개 변수 전달 중에이 오류를 알아낼 수 없습니다.C에서 이중 포인터를 형변환

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

typedef char my_char; 

void myfunc(const my_char** data) 
{ 
    printf ("%s\n", *data); 
    printf ("%s\n", *(data + 1)); 
} 

int main(){ 

    char **mydata; 
    mydata = malloc(sizeof(char*)*2); 
    mydata[0] = malloc(sizeof(char)*50); 
    mydata[1] = malloc(sizeof(char)*50); 

    memset(mydata[0],'\0',50); 
    memset(mydata[1],'\0',50); 
    strcpy (mydata[0], "Hello"); 
    strcpy (mydata[1], "world"); 

    myfunc((my_char**)mydata); 

    free (mydata[0]); 
    free (mydata[1]); 
    free (mydata); 

    return 0; 
} 

제대로 작동합니다. 하지만 인수를 명시 적으로 타입 변환 할 때 경고가 나타납니다. 이게 왜 그렇게? 표시 경고는 다음과 같습니다

warning: passing argument 1 of ‘myfunc’ from incompatible pointer type 

는 지금까지 내가 아는 한, 타입 캐스팅은 컴파일러가 포인터에 들고되는 데이터의 유형, 이해하는 데 도움이됩니다. 그러나 여기에서는 전혀 도움이되지 않습니다.

+2

'const my_char **'와'my_char **'는 호환되지 않습니다. –

+1

이것은 downvotes에 대한 확실하지 않은 합리적인 질문입니다. 그것은 [C FAQ] (http://c-faq.com/ansi/constmismatch.html)에 있지만 다른 소개 자료는 주제를 다루지 않았을 수 있습니다. –

+0

@SouravGhosh 나는 const가별로 차이가 없다고 생각했다. – 0aslam0

답변

2

데이터 형식을 typecasting하는 동안 const을 사용하십시오.

myfunc((const my_char**)mydata); 

해당 값은 함수에서 const으로 표시됩니다.

0

const 제거는 CONST를 추가하면 선언에서 혼동에 전달 인수의 유형을 일으키는, 그래서 같은 데이터 요소 유형 캐스트 ​​:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

typedef char my_char; 

void myfunc(my_char** data) 
{ 
    printf("%s\n", *data); 
    printf("%s\n", *(data + 1)); 
} 

int main(){ 

    char **mydata; 
    mydata = (char **)malloc(sizeof(char*)* 2); 
    mydata[0] = (char *)malloc(sizeof(char)* 50); 
    mydata[1] = (char *)malloc(sizeof(char)* 50); 

    memset(mydata[0], '\0', 50); 
    memset(mydata[1], '\0', 50); 
    strcpy(mydata[0], "Hello"); 
    strcpy(mydata[1], "world"); 

    myfunc((my_char**)mydata); 

    free(mydata[0]); 
    free(mydata[1]); 
    free(mydata); 

    return 0; 
} 
+0

나는 투표를하지 않았지만 이유가 있어야합니다. 당신은 올바르지 않은 함수 인자 타입을 바꾸고 있습니다. – Gopi

+0

감사합니다. gopi에 답을 추가 할 것입니다. –

+0

[malloc을 캐스팅하지 않는 것이 좋습니다 (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). 또한'const'를 사용하여 가리키는 데이터를 수정하지 않는 함수를위한 좋은 코드 디자인이기 때문에이를 제거하라는 조언은 아닙니다. (비록 "좋은"해결 방법이 없다는 것은 인정되지만) –

0

당신 무효 myfunc에에서 const를 제거 (CONST 중 하나을 my_char ** 데이터) void myfunc (my_char ** data) 또는 타입 캐스팅을 제공하는 동안 const myfunc (const my_char **) mydata);

관련 문제