人々がこれを重複とマークし始める前に、私は以下のすべてを読みましたが、どれも私が探している答えを提供していません:
- C FAQ:mallocの戻り値をキャストすることの何が問題になっていますか?
- SO:malloc()の戻り値を明示的にキャストする必要がありますか?
- SO:Cでの不要なポインターキャスト
- SO:mallocの結果をキャストしますか?
C FAQと上記の質問に対する多くの回答の両方が、キャストmalloc
の戻り値が隠すことができるという不思議なエラーを引用しています。ただし、実際にはそのようなエラーの具体例を示すものはありません。今、私がエラーを言ったことに注意してください、ではなく警告。
ここで、次のコードが与えられます。
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
上記のコードをgcc4.2でコンパイルすると、キャストがある場合とない場合で同じ警告が表示され、プログラムは正しく実行され、どちらの場合も同じ結果が得られます。
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
では、キャストmalloc
の戻り値が原因で発生する可能性のあるコンパイルエラーまたはランタイムエラーの特定のコード例を誰かに示すことができますか、それともこれは単なる都市伝説ですか?
編集私はこの問題に関して2つのよく書かれた議論に出くわしました:
- キャスティングに賛成:CERTアドバイザリ: キャストをメモリ割り当て関数呼び出しの結果を、割り当てられたタイプへのポインタにすぐにキャストします
- キャストに対して (2012-02-14現在の404エラー:2010-01-27からのインターネットアーカイブウェイバックマシンのコピーを使用してください。{2016-03-18: "robots.txtのため、ページをクロールまたは表示できません。"})
void
ポインタをキャストすると、コードをC ++としてコンパイルできます。これは機能だと言う人もいますが、バグだと思います;)