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的结果进行铸造就解决了这个问题。但我不明白为什么这个问题说,铸造的结果马尔洛克是不必要的。
- 从"void*"到"node*"&91;-fpermissive&93的无效转换可能重复;
- 如何进行此类型转换的可能副本?.
你用C++编译器编译了这个C程序。有必要在C++中使用MALOC的结果,而不是在C.中。
你有可能把代码编译成C++吗?在C++中,需要强制转换。
在你的情况下,
将根据需要分配内存,并返回可分配给任何指针的指针,如本文档中所述。
正如您指出的,您可能使用的是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,而t是char *因此是警告。
案例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的维护成本更低,因为它减少了人们无法理解代码意图的可能性。
- 您的案例2和3(没有#include 无效。在C99或更高版本中,调用没有可见声明的函数(包括malloc)具有未定义的行为。在c99之前,两种情况2和3都有未定义的行为;编译器假定malloc返回int,但实际上它返回void*。情况1是正确的。情况4不容易维护;如果t的类型发生更改,则必须同时更新char*的两个事件。
- 维护代码的费用不是必须进行多少更改。这是程序员不理解程序的风险。显式强制转换确保读取代码的人理解原始程序员的意图。
- 我想说,对一个精通语言的人来说,理解是最重要的因素。一个有经验的C程序员应该知道,不需要强制执行malloc的结果。c-faq.com/malloc/mallonocast.html
你需要在那里明确地做一个演员表。malloc返回指向void的指针,即void*。
如果用C编译代码,Value *将根据需要被提升为类型*,但是C++上不是这样。
- 不,他不需要强制转换;他只需要用C编译器编译他的C代码。(如果问题已经被标记为C++,那么你的答案就更正确了,尽管使用EDCOX1,0,而不是EDCOX1,1将是更好的建议。)