[英]Why must I cast the result from malloc?
以下代碼給出錯誤"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 ++上不是這樣
感謝您提出這個明確而明確的問題,關於一個似乎產生了很多意見的話題。 我在名為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
,但是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中的演員陳述(char *)
可以被認為是無關緊要的。 但是,它確實為人類提供了信息。 在這種情況下,C編譯器將void *
轉換為char *
就像沒有強制轉換一樣!
案例4在代碼的生命周期內維護成本更低,因為它減少了人們不理解代碼意圖的機會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.