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 *任意のオブジェクト ポインター型との間で暗黙的に変換可能な型です。そうではないので、 aを aにvoid **代入できますが、 andで同じことはできません。char *void *char **void **

その理由は、それらが互換性のない型であるためです: char ** a を指し、 achar *void **指すvoid *ため、それらの基本型は一致しません。

于 2013-08-06T21:35:46.170 に答える
1

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を試していませんが、うまくいくはずですが、絶対に必要でないのにボイドを使用するのはなぜですか。

// 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を使用する明確な理由はないため、2番目の例のソリューションAがおそらく適切です。

于 2013-08-06T21:58:10.160 に答える