关于C#:为什么我必须从malloc转换结果?

Why must I cast the result from malloc?

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

1
2
3
4
5
6
7
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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

然而,将malloc的结果进行铸造就解决了这个问题。但我不明白为什么这个问题说,铸造的结果马尔洛克是不必要的。


你用C++编译器编译了这个C程序。有必要在C++中使用MALOC的结果,而不是在C.中。


你有可能把代码编译成C++吗?在C++中,需要强制转换。


在你的情况下,

1
malloc(20);

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

正如您指出的,您可能使用的是C++编译器,因为在C中它实际上被认为是一个不好的结果。


感谢你提出的这个清晰明确的问题,关于一个似乎会产生很多意见的话题。我已经在名为main.c的源文件上运行了四个版本的代码,使用eclipse/microsoft c编译器。

案例1:

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

案例1没有错误,也没有铸造malloc

案例2:

1
2
3
4
   //#include<stdlib.h>  <<== stdlib.h commented out!!
   int main(){
      char *t = malloc(20);
   }

案例2,收到以下警告:

1
   ..\main.c(14) : warning C4047: 'initializing' : 'char *' differs in levels of indirection from 'int'

这是因为malloc是在中定义的,当没有提供函数的原型时,c假定函数返回int,而tchar *因此是警告。

案例3:

1
2
3
4
   //#include<stdlib.h>  <<== stdlib.h commented out
   int main(){
      char *t = (char *) malloc(20);
   }

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

最后,案例4:

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

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

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


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

如果用C编译代码,Value *将根据需要被提升为类型*,但是C++上不是这样。