Today I reached page 167 of The C Programming Language (second edition Brian W. Kernighan & Dennis M. Ritchie)そして著者は私がキャストしなければならないと言っているのを見つけました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
(およびそのファミリー)が型を返すことを知っています空所*、 そしてキャストしない理由には十分な説明があるmalloc
。
しかし、私の疑問は、なぜ本にはそれをキャストすべきだと書いてあるかということです。
ベストアンサー1
からhttp://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm:
ANSI C 以前では、K&R-1 で説明されているように、 malloc() は を返し
char *
、受け取る変数も ではない場合には必ずその戻り値をキャストする必要がありましたchar *
。標準 C の新しいvoid *
型では、このような変更は不要です。K&R-2 を不必要に擁護する恥ずかしさから誰かを救うために、私はデニス・リッチーに、142 ページに引用した上記の文章の妥当性について引用できる意見を求めました。彼は次のように答えました。
いずれにせよ、142 ページの内容を読み直してみると、間違っていると思います。以前のルールを防御するだけでなく、ANSI ルールを誤って表現するような書き方になっています。