5

次のコードでエラーが発生します "error: invalid conversion from void* to char* [-fpermissive]"

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){
    char *t = malloc(20);
}

ただし、malloc の結果をキャストすると問題が解決します。しかし、この質問は malloc の結果をキャストする必要がないと言っているので、その理由を理解できません。

4

5 に答える 5

16

C++ コンパイラを使用してこの C プログラムをコンパイルしました。C++ では malloc の結果をキャストする必要がありますが、C では必要ありませ

于 2013-05-29T13:40:21.527 に答える
2

あなたの場合、

malloc(20);

このドキュメントで説明されているように、必要に応じてメモリを割り当て、任意のポインターに割り当てることができるポインターを返します

指摘したように、C ではmalloc の結果をキャストするのは実際には悪い習慣と見なされているため、おそらく C++ コンパイラを使用しているでしょう。

于 2013-05-29T13:51:26.277 に答える
0

多くの意見を生み出すと思われるトピックについて、この明確で明白な質問をありがとう. という名前のソース ファイルで 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 は関数が を返していると想定しますinttchar *したがって警告です。

ケース 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 は、人間がコードの意図を理解しない可能性が減るという点で、コードの有効期間にわたって維持する方が安価です。

于 2013-08-03T20:33:27.020 に答える
0

そこで明示的にキャストする必要があります。malloc は void へのポインタ、つまり void * を返します。

C でコードをコンパイルすると、必要に応じて void * が type * に昇格されますが、これは C++ には当てはまりません。

于 2013-05-29T13:45:14.877 に答える