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 回答
5

您是否可以将代码编译为 c++?在 c++ 中,将需要强制转换。

于 2013-05-29T13:43:36.233 回答
2

在你的情况下,

malloc(20);

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

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

于 2013-05-29T13:51:26.277 回答
0

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

如果您使用 C 编译代码,则 void * 将根据需要提升为类型 * 但在 c++ 上并非如此

于 2013-05-29T13:45:14.877 回答
0

谢谢你提出这个清晰而明确的问题,关于一个似乎产生很多意见的话题。我已经使用 Eclipse/Microsoft C 编译器在一个名为main.c.

情况1:

  #include<stdlib.h>
  int main(){
      char *t = malloc(20);
  }

案例 1 编译没有错误,也没有malloc.

案例二:

   //#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);
   }

这编译没有错误,但仅仅是因为 cast 语句(char *)告诉编译器的结果malloc确实可以分配给t.

最后,案例4:

   #include<stdlib.h>
   int main(){
      char *t = (char *) malloc(20);
   }

这也没有编译或运行时错误。案例 4 是许多意见的重点。案例 4 中的 cast 语句(char *)可以被认为是无关的。但是,它确实向人类提供了信息。在这种情况下,C 编译器将 a 转换void *为 achar *就像没有强制转换一样!!

案例 4 在代码的整个生命周期中维护成本更低,因为它减少了人类无法理解代码意图的机会。

于 2013-08-03T20:33:27.020 回答