多くの意見を生み出すと思われるトピックについて、この明確で明白な質問をありがとう. という名前のソース ファイルで Eclipse/Microsoft C コンパイラを使用して、コードの 4 つのバージョンを実行しましたmain.c。
ケース 1:
#include<stdlib.h>
int main(){
char *t = malloc(20);
}
ケース 1 はエラーなしでコンパイルされ、 のキャストはありませんでしmallocた。
ケース 2:
//#include<stdlib.h> <<== stdlib.h commented out!!
int main(){
char *t = malloc(20);
}
ケース 2、次の警告を受け取りました。
..\main.c(14) : warning C4047: 'initializing' : 'char *' differs in levels of indirection from 'int'
この理由は、mallocで定義されている<stdlib.h>ためです。関数のプロトタイプが提供されていない場合、C は関数が を返していると想定しますintがt、char *したがって警告です。
ケース 3:
//#include<stdlib.h> <<== stdlib.h commented out
int main(){
char *t = (char *) malloc(20);
}
これはエラーなしでコンパイルされましたが、キャスト ステートメント(char *)がコンパイラに の結果をmalloc実際に代入できることを伝えたためtです。
最後に、ケース 4:
#include<stdlib.h>
int main(){
char *t = (char *) malloc(20);
}
これも、コンパイル エラーや実行時エラーなしで実行されました。そしてケース4は意見の多いポイントです。ケース 4のキャスト ステートメント(char *)は無関係と見なすことができます。しかし、それは人間に情報を提供します。この場合、C コンパイラは、キャストなしで行うのと同じようにavoid *を a に変換します!!char *
ケース 4 は、人間がコードの意図を理解しない可能性が減るという点で、コードの有効期間にわたって維持する方が安価です。