多くの意見を生み出すと思われるトピックについて、この明確で明白な質問をありがとう. という名前のソース ファイルで 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 は、人間がコードの意図を理解しない可能性が減るという点で、コードの有効期間にわたって維持する方が安価です。