2012-11-05 32 views
4

可能重複:
Why does C++ require a cast for malloc() but C doesn’t?指針用C對C++

此特定的碼片運行用C很好,但是當作爲C++程序編譯給編譯錯誤。

#include<stdio.h> 
#include<stdlib.h> 
int main(){ 
    int (*b)[10]; 
    b = calloc(20, sizeof(int)); 
    return 0; 
} 

誤差在C++編譯:

test.cpp: In function ‘int main()’: 
test.cpp:9:28: error: invalid conversion from ‘void*’ to ‘int (*)[10]’ [-fpermissive] 

任何想法可能是什麼原因呢?

+0

您可以指定哪些C和C++編譯器使用? –

+1

C++是強類型的... – 2012-11-05 06:22:31

回答

6

而在c您可以施放/對空指針到其他指針類型含蓄,它不是在C++中允許的,你需要明確的強制轉換:

b = (int (*)[10])calloc(20, sizeof(int)); 
0

C更寬容,當談到在投射時,C++要求你在投射時是明確的。你也應該在C版本中投射它。

+4

實際上,在C語言中,演員通常被認爲是一個壞主意,因爲它是冗長的,可以隱藏錯誤。請參閱http://stackoverflow.com/q/605845/485561 – Mankarse

1

C++是比C更嚴格的類型檢查語言。 因此,您需要手動進行類型轉換,但在C中會自動進行類型轉換。

這裏calloc返回void*bint(*)[]類型,因此強制類型轉換是必需的。

在C++其他類型的種姓也可,你需要牢記

<static_cast> 
<const_cast> 
<reinterpret_cast> 
<dynamic_cast> 

更多看到這個 When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?