タイトル通りmalloc()の戻り値をキャストするべきかどうか、皆さんの意見をお伺いしたいです。ANSI-Cでは、malloc()の戻り値の型はvoid*になっており、キャストは不要だとは思うのですが、実際には、キャストが書かれているコードを結構見かけます。不要だから余計なものを書かないほうがよいという意見も見たことがあるのですが、皆さんはどう思いますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
不要だから余計なものを書かないほうがよいという意見も見たことがあるのですが
そうですね、うっかり#include <stdlib.h>
を忘れた場合、C99未満ではプロトタイプの存在しないmalloc
関数がint
を返すものとみなされてしまう、という状況(暗黙の関数宣言)も発生します。
キャストしていなければint
の返り値をそのままポインタに代入することはできないのでコンパイルエラーとなりますが、明示的にキャストしているとそのままコンパイルを通ってしまうこともありえます。
投稿2020/09/01 01:13
総合スコア146018
0
僕はキャストする派です。
C と C++ とで書き分けるのが面倒だから。
投稿2020/09/01 05:24
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/01 05:55
2020/09/01 06:16 編集
2020/09/01 06:30
0
こんにちは。
どうやら本質的には型キャストの問題のようですね。
C++界隈ではCスタイル・キャスト(C言語のキャスト)は邪悪なので使うべきでないとも言われています。
コンパイラが検出できる記述ミス(≒バグ)をCスタイル・キャストは台無しにするからです。原理はmaisumakunさんが回答されている通りです。
Cスタイル・キャストしかないC言語にこの原則を当てはめることができるケースは稀ですが、今回の質問のケースでは当てはめることができそうです。ならば、「Cスタイル・キャストはできるだけ使わない」原則に従って「キャストしない」が望ましい記述と思います。
なお、キャストしているコードは多いと思います。私もその一人でした。当時は、キャストしないとエラーになるから盲目的にキャストしてました。ベターCとしてC++を使っているとそうなりそうです。
投稿2020/09/01 04:13
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Cでは省略しても問題ありません。
C++の場合、キャストが無いとコンパイルエラーになります。
投稿2020/09/01 00:35
編集2020/09/01 00:36退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/01 00:39
退会済みユーザー
2020/09/01 00:46
2020/09/01 01:07
退会済みユーザー
2020/09/01 01:44
0
キャストは型変換をすることで、明示的なものと暗黙的なものがあります。たとえば次は暗黙のキャストです。
C
1int* ptr = malloc(100);
void*
型のポインタを int*
型に変換しています。次のように書くと同じ意味ですが明示的なキャストになります。
C
1int* ptr = (int*)malloc(100);
次のようにポインタ演算する場合、キャストは必要不可欠です。次の iptr + 1
と cptr + 1
は違う値を指します。
C
1#include <stdio.h> 2#include <stdlib.h> 3 4int main() { 5 void* ptr = malloc(100); 6 int* iptr = ptr; 7 char* cptr = ptr; 8 printf("%p %p", cptr + 1, iptr + 1); 9 free(ptr); 10}
malloc
でメモリを得る場合、配列などの大きなメモリであることがしばしば考えられます。その場合、アドレス演算が必要になる可能性が高いため、それなりの型にキャストが必要なことが多いでしょう。逆に演算しないなら、そのポインタが示す先の型が何でもよいことを示すため、void*
のままでも問題ないと思います。
追記
コンパイラによって暗黙のキャストがされる場合でも明示的キャストをしなければならないかという質問なら、「冗長であるし警告が出ないので、しなくて良い」と答えます。maisumakun さんの回答にあるように、強引なキャストによってバグが見えにくくなることもあります。
した方が良いかという質問なら「どちらでも良いのでチームのコーディング規約に従うか、個人開発の場合は好きな方を使えば良い」と答えます。
自分ならするかという質問なら「私はしない」と答えます。C 言語のソースコードは、C 言語としてコンパイルします。C++ ならもっと C++ らしい書き方をするでしょう。そしてこの質問は C 言語の質問です。
追記
途中からわざわざ導入された書き方なので、制定者たちエキスパートの知見を信じるなら、「使える状況で絶対に明示的キャストを省略してはいけない理由」は少なくともないと思います。むしろ需要があるからこそ供給されたものです。
いくつかの C 言語のコードに明示的キャストが無かった場合、コードを書いた人が明示的キャストを選ばなかった理由はそれぞれあると思いますが、C 言語の歴史に思いをはせるなら、その理由の大半が「古いコードである」または「古い書き方をそのまま使っている」と言って間違いないのではないかと思います。
投稿2020/09/01 01:26
編集2020/09/01 02:36総合スコア28669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/01 01:32
2020/09/01 01:33
2020/09/02 03:57
2020/09/02 04:00
2020/09/02 04:20
2020/09/02 04:30
2020/09/02 04:33
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/01 01:54
2020/09/01 15:33