2017-05-27 16 views
1

これらのテストでは、コンパイル時にエラーが発生することはありませんが、異なるタイプのポインタが返されています。void * function()の使用する戻り値の型は?

void *testone(void *x) 
{ 
    return (x); 
} 

void *testtwo(void *x) 
{ 
    char *y; 
    return (y); 
} 

私はmemcpy関数を再作成しようとしていますし、私がvoidポインタ、またはunsigned char型のポインタを返す必要がある場合は、私が言うことができないので、これは特に混乱しています。

+1

'testtwo'は初期化されていない値を返すため安全ではありません。タイプとは関係がありません。 – zwol

+0

あなたは(「未使用のパラメータ」の警告を回避するため) '' void *型testtwo(無効)を使用して、 'y'を初期化することによって、コンパイラといくつかのマイナーな問題を避けることができます。しかし、それらはあなたの質問にほとんど接しているニックスティックですが、それは十分に明確です。 –

+0

Void * genericポインタ。この場合、戻り値の型は任意の型のポインタである必要があります。 – LethalProgrammer

答えて

2

Cでは、任意のオブジェクトポインタ型をvoid *に変換でき、void *はキャストなしで任意のオブジェクトポインタ型に変換できます。

あなたのコードはこれらのルールに従います。それはOKです。コンパイラは不平を言ってはいけません。

ISO/IEC 9899:2011§6.3.2.3ポインタは:

¶1voidへのポインタ、または任意のオブジェクト型へのポインタから変換することができます。 のオブジェクト型へのポインタは、voidへのポインタに変換され、再び戻されます。結果は と元のポインタを比較します。

「オブジェクトが」機能を除外することを注意 - 関数ポインタは別のルールを持っている:

¶8一種の関数へのポインタは、別 タイプの関数へのポインタに変換することができると再び;結果は元のポインタと等しいとみなされます。変換 ポインタがそのタイプ参照タイプと互換性のない機能を呼び出すために使用される場合、 動作は未定義です。

関連する問題