1. ホーム
  2. c

[解決済み] C言語では、なぜポインタを解放する前にキャストする人がいるのですか?

2022-04-23 14:17:33

質問

古いコードベースで作業しているのですが、free()の呼び出しのほとんどで、引数にキャストが使用されています。例えば、以下のようなものです。

free((float *)velocity);
free((float *)acceleration);
free((char *)label);

ここで、それぞれのポインタは対応する(そして一致する)型である。このようなことをする意味は全くないと思います。非常に古いコードなので、K&Rのことなのかどうか疑問が残ります。もしそうなら、実はこれを要求していたかもしれない古いコンパイラをサポートしたいので、削除はしたくありません。

これらのキャストを使用する技術的な理由はあるのでしょうか?実用的な理由もあまり見当たりません。データ型を解放する前に、そのデータ型を思い出すことに何の意味があるのでしょうか?

編集部:この質問は ではない は、もう一つの質問と重複しています。もう一つの質問は、この質問の特殊なケースで、近い投票者がすべての回答を読めば明らかだと思います。

奥付です。しかし、ANSI C以前の慣習(少なくとも一部のプログラマーの間で)であるという回答は、私のケースで使用された理由であるように思われます。ここでは多くの人が良い点を指摘しています。ご寄稿ありがとうございました。

解決方法は?

ポインタが以下のような場合、コンパイラの警告を解決するためにキャストが必要な場合があります。 const . 以下は、freeの引数をキャストせずに警告を発生させるコードの例です。

const float* velocity = malloc(2*sizeof(float));
free(velocity);

とコンパイラ(gcc 4.8.3)は言っています。

main.c: In function ‘main’:
main.c:9:5: warning: passing argument 1 of ‘free’ discards ‘const’ qualifier from pointer target type [enabled by default]
     free(velocity);
     ^
In file included from main.c:2:0:
/usr/include/stdlib.h:482:13: note: expected ‘void *’ but argument is of type ‘const float *’
 extern void free (void *__ptr) __THROW;

を使用する場合 free((float*) velocity); を指定すると、コンパイラは文句を言わなくなります。