2013-08-06 62 views
1

我不明白为什么编译器警告我关于在此代码中传递不兼容的指针类型:(在这种情况下void *void **之间有什么区别)(我不知道这是否有所作为,但我正在使用gnu99 C版)传递给void **而不是void *会让编译器抱怨类型,为什么?

void someFunc(void ** foo) { 
    printf("%s\n", *foo); 
} 

int main() { 

    char * text = "some text"; 
    someFunc(&text); 

    return 0; 
} 

和在预先

回答

6

void *此不

void someFunc(void * foo) { 
    printf("%s\n", foo); 
} 

int main() { 

    char * text = "some text"; 
    someFunc(text); 

    return 0; 
} 

由于是一类可隐式转换为任何对象指针类型并从其中转换。 void **不是 - 所以当你可以指定一个char *void *,可以做同样的char **void **

的原因是,他们是不兼容的类型:char **指向char *void **指向一个void *,所以他们的基本类型不匹配。

+0

好吧,理解,所以当我有一个交换功能,如 无效交换( ** a, ** b)交换指针,而不是值。如果我想使它通用(类型不敏感或其他)什么是正确的方法来做到这一点? – Sasquash

+0

@Sasquash对不起,我没有明白你的意思。为了交换'T'类型的两个值就足够了'T *'。 – 2013-08-07 07:08:58

1

要解决你的代码在第二个例子中,你可以做以下之一:

// Solution A, preferred: 
void someFunc(char * foo) { 
    printf("%s\n", foo); 
} 

int main() { 

    char * text = "some text"; 
    someFunc(text); 

    return 0; 
} 

在一个你告诉编译器传递的参数是指向一个char。 我还没有尝试过解决方案B,应该工作,但为什么使用空洞,如果他们不是绝对必要的。

// Solution B, should work but a purist might object: 
void someFunc(void * foo) { 
    printf("%s\n", foo); 
} 

int main() { 

    char * text = "some text"; 
    someFunc((void *) text); 

    return 0; 
} 

在这个问题上没有明显的理由要使用双PTR,所以解决方案用于您的第二个例子是可能的路要走。

相关问题