[解決済み] mallocの結果はキャストするのですか?
質問
で
この質問
で、ある人が提案した。
コメント
ということを
ではなく
の結果をキャストします。
malloc
.つまり、こうすればいいんだ。
int *sieve = malloc(sizeof(*sieve) * length);
よりも
int *sieve = (int *) malloc(sizeof(*sieve) * length);
なぜそうなるのでしょうか?
どうすれば解決するの?
TL;DR
int *sieve = (int *) malloc(sizeof(int) * length);
には2つの問題があります。キャストと、sizeofの引数に変数ではなく型を使っていることです。代わりに、次のようにします。
int *sieve = malloc(sizeof *sieve * length);
ロングバージョン
いいえ ;あなた しない は、その結果を鋳造します。
-
として、不要です。
void *
は、この場合、自動的に安全に他の任意のポインタ型に昇格します。 - コードが煩雑になる、キャストが読みにくい(特にポインタ型が長い場合)
- 同じことを繰り返すことになり、一般に好ましくない。
-
を入れ忘れた場合、エラーを隠蔽することができます。
<stdlib.h>
. これは、クラッシュの原因になります(もっと悪いことに。 ない が発生する可能性があります。) ポインタと整数のサイズが異なる場合、どうなるかを考えてみてください。この場合、キャストによって警告が隠され、返されたアドレスのビットが失われる可能性があります。注意: C99 では暗黙の関数がなくなり、宣言されていない関数が自動的にint
.
補足すると、私が言ったのは「キャストしない」であって、「キャストしない」ではないことに注意してください。 必要 を鋳造してください。私の考えでは、たとえ正しくできたとしても、キャストを入れないと失敗です。キャストを入れるということは、そのリスクについて知らないということなのです。
また、コメント欄で指摘されているように、上記はC++ではなく、ストレートCについて述べていることに注意してください。私は、CとC++は別の言語であると固く信じています。
さらに付け加えると、あなたのコードは型情報を不必要に繰り返しています(
int
) エラーの原因となることがあります。戻り値を格納するために使用されているポインタの参照を解除して、2つを一緒にロックする方がよいでしょう。
int *sieve = malloc(length * sizeof *sieve);
また、これは
length
を前面に出して視認性を向上させ、冗長な括弧を削除して
sizeof
を使用します。
は必要なだけです。
は、引数が型名である場合です。多くの人はこのことを知らない(あるいは無視している)ようで、そのためにコードが冗長になっています。覚えておいてください。
sizeof
は関数ではありません! :)
移動中
length
を前面へ
かもしれない
まれに視認性が向上する場合もあるが、一般的には次のように書いた方が良いので注意が必要である。
int *sieve = malloc(sizeof *sieve * length);
を残しているので
sizeof
を先にすることで、この場合、乗算は少なくとも
size_t
を計算します。
比べてみてください。
malloc(sizeof *sieve * length * width)
vs.
malloc(length * width * sizeof *sieve)
をオーバーフローさせる可能性があります。
length * width
としたとき
width
と
length
よりも小さいタイプです。
size_t
.
関連
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】malloc+memsetはcallocより遅いのはなぜ?
-
[解決済み] C言語プログラミング言語」の本には、なぜmallocをキャストしなければならないと書いてあるのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する