グラムが自動的にf(void**)
へf
のプロトタイプを変換++私は、正確な用語を使用して、より良いプログラミング言語を理解するのに役立ちますことを見つけます。 f
がであると考えるのは紛らわしいかもしれません。をf(void**)
に変換してください。それは賢明に事件を話していません。 f(void *data[])
は、単にf(void** data)
と書くもう1つの方法です。この別の構文は、構文砂糖の場合です。
通常、変換はあるタイプから別のタイプへの変更を意味します。関数の宣言には変換がありません。
また、この構文糖はコンパイラg ++に固有のものではありません。この動作はC++標準で指定されています。
f(cnt);
それはcnt
size_t**
この
は実際の変換で変換されます。これは、
と呼ばれる特別なタイプの変換で、壊れるのはです。この暗黙的な変換も、構文上の砂糖です。これは、書き込みのように、意味的に同じである:
f(&cnt[0]);
は*引数[]これが正しいのボイドポインタ
の配列を必要とする機能するようにsize_t型を渡すことはできません。
実際には、関数にはvoid**
が必要ですが、関数にはsize_t**
が渡されます。 size_t**
は暗黙的にvoid**
に変換されないので、プログラムは不正です。
1)の代わりにf(size_t**)
を使用してください:
つの方法は、問題を修正します。
2)別の配列void *temp[8]
に最初の場所
3)コピーsize_t *cnt[8]
にvoid*
のアレイを使用して、関数にそれを渡します。
4)(推奨しません)cnt
〜void**
をキャストし、機能が期待していることを期待してください。
「void *」の代わりにテンプレートと実際のタイプを使用してみませんか? – NathanOliver
g ++ではありません。それはC++です。 'f(void * data [])'は 'f(void ** data)'と同じです – juanchopanza
とにかく、予期した動作です。しかし、あなたの質問は何ですか? – juanchopanza