为什么我必须强制转换malloc的结果?

  • 本文关键字:malloc 转换 结果 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的结果可以解决这个问题。但是我不明白为什么这个问题说不需要转换malloc的结果。

您使用c++编译器编译了这个C程序。在c++中强制转换malloc的结果是必要的,但在C中不需要。

是否有可能将代码编译为c++?在c++中需要强制转换

在你的例子中

malloc(20);

将根据需要分配内存,并返回一个指针,该指针可以分配给任何指针,如本文档所述

如前所述,您可能正在使用c++编译器,因为在C中,强制转换malloc的结果实际上被认为是一种不好的做法。

您需要在那里显式地进行强制转换。Malloc返回指向void的指针,即void *.

如果你用C编译代码,void *会根据需要被提升为*类型,但在c++中不是这样

感谢你提出这个清晰明确的问题,这个话题似乎引发了很多意见。我使用Eclipse/Microsoft C编译器在一个名为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,但tchar *,因此发出警告。

案例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是许多观点的观点。Case 4中的强制转换语句(char *)可以被认为是无关的。然而,它确实为人类提供了信息。在这种情况下,C编译器将void *转换为char *,就像没有强制转换一样!!

情况4在代码的整个生命周期中维护成本更低,因为它减少了人们不理解代码意图的机会。

相关内容

  • 没有找到相关文章

最新更新