传递给void **而不是void *会让编译器抱怨类型,为什么?

时间:2013-08-06 21:32:56

标签: c void-pointers

我不明白为什么编译器警告我在这段代码中传递一个不兼容的指针类型:(在这种情况下void *void **之间有什么区别)(我不知道如果这有所不同但我使用gnu99 C版本)

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

int main() {

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

    return 0;
}

并且在此不是

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

int main() {

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

    return 0;
}

提前致谢

2 个答案:

答案 0 :(得分:6)

void *是一种可以隐式转换为任何对象指针类型的类型。 void **不是 - 所以虽然您可以将char *分配给void *,但您可以 对{ {1}}和char **

原因是它们是不兼容的类型: void **指向char **char *指向void **,因此它们的基础类型不匹配。

答案 1 :(得分:1)

要修复第二个示例中的代码,您可以执行以下操作之一:

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

int main() {

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

    return 0;
}

在A中,您告诉编译器传递的参数是指向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,所以你的第二个例子的解决方案A可能是要走的路。