【问题标题】:Passing to void** instead void* makes the compiler complain about types, why?传递给 void** 而不是 void* 会使编译器抱怨类型,为什么?
【发布时间】:2013-08-06 21:32:56
【问题描述】:

我不明白为什么编译器会警告我在此代码中传递不兼容的指针类型:(在这种情况下,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;
}

提前致谢

【问题讨论】:

    标签: c void-pointers


    【解决方案1】:

    void * 是一种可隐式转换为任何对象指针类型的类型。 void ** 不是 - 所以虽然您可以将 char * 分配给 void *,但您可以不对 char ** 和 void ** 执行相同的操作.

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

    【讨论】:

    • 好的,明白了,所以当我有一个像 void swap( ** a, ** b) 这样的交换函数来交换指针而不是值时。如果我想让它通用(类型不敏感或其他),那么正确的方法是什么?
    • @Sasquash 对不起,我不明白你的意思。拥有T * 就足以交换T 类型的两个值。
    【解决方案2】:

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

    // 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 可能是要走的路。

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 1970-01-01
      • 2012-09-12
      • 2016-11-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多