以下代码给出了错误
"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 返回指向 void 的指针,即 void *。
如果您使用 C 编译代码,则 void * 将根据需要提升为类型 * 但在 c++ 上并非如此
谢谢你提出这个清晰而明确的问题,关于一个似乎产生很多意见的话题。我已经使用 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 在代码的整个生命周期中维护成本更低,因为它减少了人类无法理解代码意图的机会。