2017-04-11 209 views
0

我找到了計算合併排序的執行時間的代碼。我收到一個錯誤,說「無法將void轉換爲int」。而且我從這段代碼的一部分,上面寫着x = malloc(n * sizeof (int));x = malloc(n * sizeof(int));無法將void轉換爲int

x = malloc(n * sizeof (int)); 
+1

C++和C的區別在這裏。 C++對於什麼可以轉換爲什麼有更嚴格的規則。 'void *'需要強制轉換爲'int *'。爲什麼在C++中使用'malloc'呢?你應該發現'新'更容易使用。 – user4581301

+5

您應該提供[mcve]。你發佈的大部分代碼都是不相關的。三線計劃將做。 – juanchopanza

+0

現在你錯過了'x'的聲明,這很重要。 – juanchopanza

回答

0

你應該投malloc的這樣得到的錯誤。

x = (int *)malloc(sizeof(int) * n) 

因爲malloc的只是返回空指針

+0

他們不應該在第一種情況下使用'malloc'。這或使用C編譯器。 – user4581301

+0

@ Jingbe它的工作原理,但現在我得到了一個錯誤說Lingking .. \ SOURCE \ MERGY.EXE – Leve

+1

@Leve該錯誤可能是由於編譯器或開發工具。嘗試重置您使用的工具 – jingbe

1

C++編譯器比C編譯器更加嚴格。因此,並非所有的C代碼都將使用C++編譯器進行編譯,因此如果不使用任何C++功能,則不應使用C++編譯器。

malloc回報void *所以你必須將它轉換爲相應的類型,只要你使用的是C編譯器:

Type * x = (Type *) malloc (sizeof(Type)); 

但是如果你必須使用C++和malloc的,然後像在評論中提到的,在C樣式轉換應該是最後的手段,你應該寧願使用static_cast

Type * x = static_cast<Type *>(malloc(sizeof(Type))); 
+0

有人是隨機投票... – Mansuro

+0

它的工作原理,但現在我得到了一個錯誤說Lingking .. \ SOURCE \ MERGY.EXE – Leve

+0

@Leve鏈接器錯誤是棘手的,你必須提供更多的信息 – Mansuro

2

因爲這個問題被打上C++,我推薦一個完全不同的解決方案:擁抱C的功率++和使用一個std::vector

std::vector<int> descriptiveNameHere(n); 

這種方法使您不必手動管理內存分配。當允許vector超出範圍時,存儲將自動釋放。

Documentation on std::vector

+0

雖然我當然同意,在新代碼之一應該使用'std :: vector' 它不回答問題,甚至可能是錯誤的,因爲不知道代碼後面會發生什麼。新分配的數組也可以傳遞給一個函數(它不會編譯),該函數接受指針的所有權並在稍後刪除它(這將是一個錯誤)。 –

+0

@GertWollny我知道代碼的其餘部分是什麼;它是從一個使用字母湯的不幸方言複製的合併排序OP的C實現。是的,OP還必須修改另一個函數來接受'vector',但我仍然認爲'vector'優於'malloc'和'new'。有時你必須去X-Y而不是提供直接的,但低級的答案。我們不應該鼓勵原始指針,特別是不要'malloc'。 'malloc'是有目的的。這不是。 – user4581301

+0

這個答案存在的主要原因是沒有其他的答案甚至提出'新'我盯着那個,然後停下來,並想,「什麼自尊的程序員不會在這裏使用'vector'? – user4581301