1

我不明白为什么编译器会警告我在此代码中传递不兼容的指针类型:(在这种情况下void *和之间有什么区别void **)(我不知道这是否会有所不同,但我使用的是gnu99C 版本)

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;
}

提前致谢

4

2 回答 2

6

void *是一种可隐式转换为任何对象指针类型和从任何对象指针类型转换的类型。void **不是 - 所以虽然你可以将 a 分配char *给 a void *,但你不能char **对and做同样的事情void **

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

于 2013-08-06T21:35:46.170 回答
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,应该可以,但是如果不是绝对必要的话,为什么要使用 voids。

// 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;
}

在这个问题中,没有明显的理由使用双指针,因此您的第二个示例的解决方案 A 可能是要走的路。

于 2013-08-06T21:58:10.160 回答