以下代码给出了错误
"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的结果。
答案 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在代码的生命周期内维护成本更低,因为它减少了人们不理解代码意图的可能性。