2012-09-14 3 views
2

libconfig를 사용하여 프로그램을 설치하려고합니다..cfg 파일을 사용한 포인터 경고

int main() 
{ 
    const char **channel; 

    config_t config; 

    config_init(&config); 

    config_read_file(&config, "example.cfg"); 
    if(config_lookup_string(&config,"value.channel",&channel) == CONFIG_FALSE) 
    { 
     printf("Failed to read fields\n"); 
     return 1; 
    } 
     printf("argumente = %s\n", (char *)channel); 
     return 0; 
} 

과 example.cfg 파일

값 = {채널 = "안녕하세요"; : 예제 파일 (example1.c)이있다 }

내가 그것을 컴파일하는 경우

GCC의 예제 파일 (example1.c) -lconfig

는 말한다 :

example1.c:39:3: Warning: delivery of arguments 3 from »config_lookup_string« of a incompatible pointer 
/usr/include/libconfig.h:244:26: Detailed: »const char **« expected, but argument has typ »const char ***« 

재미있는 것은이 작품은 ... 출력은 다음과 같습니다. argumente = hello

이 경고 메시지는 어떻게 삭제합니까? 내가 const char *channel에 decleration 출력 printf("argumente = %s\n", channel);을 변경하는 경우

, 나는 그냥 channel 당신의 선언에 하나 *을 제거 할 필요가 시작에 세그먼트 폴트와 같은 컴파일에서 경고 ... Detailed: »const char **« expected, but argument has typ »const char *«

답변

1

를받을 . 그렇게하면 printf 통화에서 전송을 삭제할 수도 있습니다.

지금 "작동 중"인 이유는 캐스트가 printf 형식에 대한 두 번째 경고를 숨기고 있기 때문입니다. 귀하의 프로그램은 여분의 *가 이미 제거 된 것처럼 행동합니다 - 단지 혼란스러운 방식입니다.

+0

이 const char * channel로 변경되었습니다. 그리고 끝에 printf ("argumente = % s \ n", 채널); 하지만 시작할 때 Segfault를 얻습니다. – Fendrix

+0

@Fendrix, 다른 것을 변경해야합니다. 원래 예제를 통해 오류 메시지를받을 수있는 방법은 없습니다. 'char *'를 한 번,'char **'를 또 한번 기대할 수 있을까요? –

관련 문제