为什么我必须从malloc转换结果?

时间:2013-05-29 13:38:39

标签: c malloc

以下代码给出了错误 "error: invalid conversion from void* to char* [-fpermissive]"

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

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

但是,转换malloc的结果可以解决问题。但我无法理解为什么this问题说不需要投射malloc的结果。

5 个答案:

答案 0 :(得分:16)

您使用C ++编译器编译了此C程序。 必须在C ++中转换malloc的结果,而不是在C中。

答案 1 :(得分:5)

您是否有可能将代码编译为c ++?在c ++中,演员阵容是必需的。

答案 2 :(得分:2)

在你的情况下,

malloc(20);

将根据需要分配内存并返回一个指针,该指针可以分配给任何指针as explained in this document

正如所指出的,你可能正在使用C ++编译器,因为在C中它实际上被认为是对malloc的cast结果的一种不好的做法。

答案 3 :(得分:0)

你需要明确地在那里进行投射。 malloc返回指向void的指针,即void *。

如果使用C编译代码,则void *将根据需要提升为类型*但在c ++上不是这样

答案 4 :(得分:0)

感谢您提出这个明确而明确的问题,关于一个似乎产生了很多意见的话题。我在名为main.c的源文件上使用Eclipse / Microsoft 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,但是{{ 1}}是t因此警告。

案例3:

char *

编译时没有错误,只是因为演员声明 //#include<stdlib.h> <<== stdlib.h commented out int main(){ char *t = (char *) malloc(20); } 告诉编译器(char *)的结果确实可以分配给malloc

最后,案例4:

t

这也没有编译或运行时错误。案例4是许多意见的要点。案例4中的演员陈述 #include<stdlib.h> int main(){ char *t = (char *) malloc(20); } 可被视为无关紧要。但是,它确实为人类提供了信息。在这种情况下,C编译器将(char *)转换为void *,就像没有强制转换一样!

案例4在代码的生命周期内维护成本更低,因为它减少了人们不理解代码意图的可能性。