簡體   English   中英

為什么我必須從malloc轉換結果?

[英]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(20);

將根據需要分配內存,並返回一個指針,該指針可以分配給任何指針, 如本文檔中所述

正如指出的那樣,你可能正在使用C ++編譯器,因為在C自己居然被認為是不好的做法, malloc的結果。

你需要在那里明確地進行演員表演。 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 ,但是tchar *因此警告。

案例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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM