2016-02-29 73 views
-2

我被給了C中的一段代碼,並且問到它的問題是什麼問題呢?我會很好的回答,但malloc鑄件前面的星號會讓我感到困惑!函數返回malloc中的C錯誤?

char f() { return *(char*)malloc(10); } 
+1

恕我直言,這星號是錯誤的功能。 – Haris

+4

提示:'*'是取消引用'malloc'返回的指針。 – dbush

+0

是的,但我需要詳細闡述它,就像它對整個代碼做的事情一樣。而且即使有星號,代碼也會編譯得很好...... – theViTALiTY

回答

6

該函數返回一個不確定的值,並有內存泄漏,因爲動態分配的內存沒有被釋放。

+0

哦,是的,這樣的分配將永遠無法獲得釋放。我失去了理智,因爲所有代碼都可以,因爲malloc返回指向void的指針,將其轉換爲char指針,然後解除引用未知值。我甚至從來沒有想過它將失去分配塊的地址,因此它不能被釋放! 非常感謝各位朋友! – theViTALiTY

+0

@theViTALiTY根本沒有。我們初學者應該互相幫助。:) –

+0

「*返回一個不確定的值*」我會說它在用於分配「something」時更引發UB:'char ch = f();' – alk

4

有幾個問題與此代碼:

  • malloc返回值沒有檢查,如果它是NULL取消引用。所以如果malloc失敗,這將導致NULL指針解引用,並可能導致核心轉儲。
  • 假設malloc成功,它返回的內存未初始化爲任何內容。該函數解引用指針並返回分配內存中的第一個字節,該字節也是未初始化的。這意味着函數返回一個未初始化的字符。
  • malloc返回的指針不保存在任何地方。這導致內存泄漏。