1. ホーム
  2. c

[解決済み] C言語プログラミング言語」の本には、なぜmallocをキャストしなければならないと書いてあるのですか?

2022-04-23 18:41:23

質問

今日、私はこのページにたどり着きました。 167 C言語(第2版 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個のオブジェクトからなる配列に十分な空き領域へのポインタを返します。 を満たすことができない。ストレージはゼロに初期化される。 malloc または calloc が返すポインタは,当該オブジェクトに対して適切なアライメントを持っている。 のように適切な型にキャストする必要があります。

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

すでに知っていること malloc (およびそのファミリ)が返す型は void* であり、かつ をキャストしない理由については、十分な説明があります。 malloc .

しかし、私の疑問は、なぜこの本には鋳造するように書かれているのか、ということです。

どのように解決するのですか?

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

ANSI C以前では -- K&R-1に記載されているように -- malloc()が返したのは char * である場合、その戻り値をキャストする必要がありました。 受信側の変数も char * . 新しい void * の型は 標準C言語では、このような工夫は必要ありません。

というのも、このような場合、「このままではいけない」という思いからです。 K&R-2を擁護するために、私はDennis Ritchieに意見を求めました。 142ページから引用した文章の妥当性について 彼は と答えた。

<ブロッククオート

いずれにせよ、今、P.142のものを読み返してみると このような書き方をしているのは、単に防衛的であるだけではありません。 それ以前のルールに対して、ANSIのルールを誤って伝えているのです。