web-dev-qa-db-ja.com

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

今日、私は The C Programming Language(second edition Brian W. Kernighan&Dennis M. Ritchie) のページ167に到達し、見つけました著者が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(およびそのファミリ)がtypevoid *を返し、- mallocをキャストしない理由が十分に説明されています

しかし、私の質問は次のとおりです。

152
Michi

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

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

K&R-2の防衛に不必要に跳躍するという恥ずかしさから誰かを救うために、私はDennis Ritchieに、上記の引用文の有効性について142ページから引用できる意見を求めました。彼は答えました。

いずれにせよ、pの内容を読み直しました。 142、私はそれが間違っていると思います。それは、以前のルールに対して防御的であるだけでなく、ANSIルールを誤って伝えているような方法で書かれています。

207
David Ranieri