下面的代码给出了错误"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
,但t
是char *
,因此发出警告。
案例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在代码的整个生命周期中维护成本更低,因为它减少了人们不理解代码意图的机会。