Cでは、void *
他のポインター型にキャストする必要はなく、常に安全に昇格されます。ただし、C ++では、そうではありません。例えば、
int *a = malloc(sizeof(int));
Cでは動作しますが、C ++では動作しません。(注:私はあなたがmalloc
C ++で、またはその点new
で使用すべきではないことを知っています、代わりにスマートポインタおよび/またはSTLを好む必要があります;これは純粋に好奇心から尋ねられます)C ++標準はこの暗黙的なキャストを許可しないのはなぜですか、 C標準はそうですか?
sizeof(*a)
代わりに使用することで簡単に修正できます。
malloc
割り当てられたタイプへのポインタを返すことはできません。 new
C ++は割り当てられた型へのポインタを返すので、適切に記述されたC ++コードにはvoid *
キャストするs がありません。
void
、Cにはありませんでした。そのキーワード/アイデアがCに追加されたとき、Cのニーズに合わせて変更しました。それは、ポインタ型がまったくチェックされ始めた直後です。あなたがオンラインK&R Cの説明パンフレットを見つけることができるかどうかを確認し、またはウェイトグループのようなCプログラミングテキストのヴィンテージコピーC入門。ANSI CはC ++からバックポートまたはインスパイアされた機能でいっぱいで、K&R Cははるかに簡単でした。そのため、C ++が当時存在していたCを拡張し、ご存知のCをC ++から削除した方が正確です。
long *a = malloc(sizeof(int));
おっと、誰かが1つのタイプだけを変更するのを忘れていました!