「Cプログラミング言語」の本でmallocをキャストする必要があると書かれているのはなぜですか?


158

今日、私は、ページに達する167言語(第二版ブライアンW.カーニハン&デニスM. Ritchie氏を)プログラミングCをし、著者は、私はキャストしなければならないと言うことがわかりましたmalloc。これは本の一部です:

7.8.5ストレージ管理

関数mallocおよびcallocは、メモリのブロックを動的に取得します。

void *malloc(size_t n)

初期化されていないストレージのnバイトへのポインタを返します。要求が満たされない場合はNULLを返します。

void *calloc(size_t n, size_t size)

指定されたサイズのn個のオブジェクトの配列に十分な空き領域へのポインタを返します。要求が満たされない場合はNULLを返します。ストレージはゼロに初期化されます。mallocまたはcallocによって返されたポインターは、問題のオブジェクトに対して適切な配置になっていますが、次のように適切な型にキャストする必要があります

int *ip;
ip = (int *) calloc(n, sizeof(int));

私はすでにそれを知っているmalloc(とその家族)戻り型void *型を、そしてなぜキャストへの良好な説明がありますmalloc

しかし、私の質問は次のとおりです。なぜこの本は私がそれをキャストするべきだと言っているのですか?


125
本が古いから。
Oliver Charlesworth

12
太陽でさえ暗い斑点があるので、私の答えでしょう。言い換えれば、本は間違っている。テキストがのセマンティクスよりも古くvoid *、更新されなかった可能性があります。この回答も参照してください。
アンワインド

8
@Michiこの本には多くの事実上の誤りや誤植(google K&R errata)があり、C90標準との互換性はわずかですが、現在のC標準や1990年以降の言語の変更については触れていません。不十分な仕様の振る舞いに依存する、不適切なプログラミング実践、不適切なスタイルおよびコード。あなたがプロのCプログラマーになるなら、それらすべてを学ぶ必要があります。
ランディン

8
...これと対照的に、mallocの結果をキャストしないとコンパイラが文句を言うのはなぜですか?したがって、Cの場合-キャストしないでください。C ++の場合-キャストしますが、C ++ではないため使用しないでmallocください-必要な場合を除いて-すべきではありません-を除いて... AGGGHHHHHH !!!!! :-)
ボブジャービス-モニカを復活

2
@マンドリルは私の質問を読んだことがありますか?私はあなたのために私の質問を編集する必要がありました。
Michi

回答:


215

http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htmから:

ANSI C以前では、K&R-1で説明されているように、malloc()はa char * を返し、受信変数もaではないすべての場合にその戻り値をキャストする必要がありましたchar *void *標準C の新しいタイプでは、これらのゆがみは不要です。

K&R-2の弁護に不必要に跳躍するという恥ずかしさから誰かを救うために、私はデニス・リッチーに、142ページから引用した上記の文の有効性について引用できる意見を求めました。

いずれにせよ、私は今、p。142、それは間違っていると思います。それは、以前のルールを守るだけでなく、ANSIルールを誤って表すような方法で書かれています。


23
したがって、mallocの戻り型はvoidではなくcharでし。ありがとうございました。
Michi

10

18
隣の紙に正誤表が印刷されていなければ、この本を読むことはできません。
ランディン

4
@Michi-いいえ、戻り値の型はchar*でしたchar。2つは大きく異なります。
ピートベッカー

20
@alk:まさに。;-)十分である2つの達人にK&R君だリスニングを読み取ることによって、
スティーブ・ジェソップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.