2011-07-16 7 views
0

私はGoogleやSO上で答えを見つけることができなかったいくつかのコードを実行しました。あなたが期待できるようにvoid *を返すスレッド関数を見ています。しかし、スレッド関数が終了する前に、突然このスタントを引っ張ります。この戻り値の目的は何ですか?

return (void*) 0; 

目的は何ですか?私はそれを理解できません。

編集:

これを理解した後に、それは彼らがSTDLIB含めスキップするためにこれを使用し、私の考えであるNULL--と同じです。

+2

'return NULL;と同じです - それはなぜ問題なのですか?たぶんコードの多くを投稿するべきでしょうか? –

+0

私はこれまでにこれを見たことがありませんでした - それは本当に一般的ですか? –

+0

確かに - どうしてですか?たぶん、NULLポインタ以外のポインタを返す関数の中の1つ以上のreturn文がありますか?もっとコードを投稿しない限り、私たちは知らないでしょう... –

答えて

3

(void*)0は別名NULL(実際には基本的に(void*)0と同じことになるいくつかのヘッダファイルに定義されたマクロ、例えばstddef.h又はstdio.h、である)、ヌルポインタです。

更新:

ヌルポインタとその有用性を説明する方法は?基本的には、「このポインタはどこにも指していない」、または「このポインタは有効なオブジェクト参照に設定されていません」という特別な値です。

ヒストリカルノート:アントニー・ホーア、1965年にはnull参照を発明したと言われて、その発明を後悔することが知られているので、彼の"Billion Dollar Mistake"、それを呼び出している:

あなたはポインタで作業するたびに

、あなたは決してに確認する必要がありますnullポインタを逆参照する(定義によって何も参照しないため)。とにかく行うと、異常なプログラムの終了、一般的な保護違反、または予期しないプログラムの動作が少なくとも発生します。

+0

スレッドからヌルを返す実用的な理由はありますか? –

+0

素晴らしい答えstakx :) –

1

まあ、私はNULLまたは0は、(例えば、またはへ/ int*から)void*に変換することはできませんと言って任意のC++コンパイラを発生していません。しかし、スマートコンパイラや静的解析ツールでは、0 to void-pointerを警告として報告することがあります。

この文は、コールバック実装(スレッドルーチンのようなもの)によく見られます。要求されるコールバックのプロトタイプ(pthread_createCreateThreadなど)に従わなければなりません。したがって、その関数を実装するときは、要求されたのと同じ型を返す必要があります。 pthread_createルーチンの場合は、void*を返さなければなりません。そのためreturn (void*)0;が存在します。

関連する問題