[解決済み] 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);
を指定すると、コンパイラは文句を言わなくなります。
関連
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] sizeof'(配列を指すポインタ)を見つけるにはどうしたらいいですか?
-
[解決済み】sizeof(あるポインタ)は常に4と同じか?
-
[解決済み] C++でポインタを参照にキャスト/変換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
[解決済み] Windows用Cコンパイラ?[クローズド]
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] C言語でランダムなint型を生成するには?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
-
[解決済み] C言語プログラミング言語」の本には、なぜmallocをキャストしなければならないと書いてあるのですか?