2013-10-07 30 views
4

我正在學習c。據我所知,malloc()分配一個字節塊,無需用戶請求無法更改或損壞,但我發現自己經常使用它。確切地說,每當我想要創建一個結構體或其任何內容時,我都會使用malloc,以後我會參考它。我也明白free()分配完畢後的內存。我在c過度使用malloc嗎?

我對malloc的使用是否正確?

+9

如果您只需要一個本地對象(即具有自動存儲持續時間和塊範圍的對象),則爲正確但過於熱情。作爲一個經驗法則:如果你在調用'malloc()'的同一個函數中使用'free()',那麼你應該擺脫它們並靜態分配struct/array /其他任何東西。 – 2013-10-07 05:41:21

+2

你不顯示任何代碼,所以你的問題在這裏脫離主題。閱讀[內存損壞](http://en.wikipedia.org/wiki/Memory_corruption),[內存泄漏](http://en.wikipedia.org/wiki/Memory_leak),並使用[valgrind](http:/ /valgrind.org/ –

+8

@Basile:只是因爲一個問題沒有代碼並不會使其脫離主題。 – icktoofay

回答

2

動態內存分配(malloc和家庭),在那裏有兩個原因:

  • 你的數據需要持續超過分配它的範圍(例如多線程)
  • 不管你是分配是你的籌碼

你真的應該避免分配動態內存對於任何其他原因太大。自動(堆棧)變量不易出錯,並在範圍末尾自動爲您分配。

像你稱之爲「損壞的內存」只能真正起因於糟糕的編程,並且可能發生在堆棧和堆上,並且不應該依賴動態內存來提供緩衝區溢出或其他導致內存損壞。

C標準庫中的許多函數得到一個指向緩衝區的指針作爲參數來放置結果的原因是:它允許您在堆棧中分配這些緩衝區。例如:

ssize_t read(int fd, void *buf, size_t count); 

另外正如另一個答案所述:你的堆棧內存已經在CPU高速緩存中,因此可以更快地訪問。

1

也請考慮其它類型的分配:

int foo; 

外塊將分配一個全局變量,這是你的流程的整個生命週期中存活,並在程序的其他模塊可見。

static int foo; 

塊的外部是相同的,但只在實際模塊中可見。

int foo; 

塊內部只有在塊中的代碼運行時纔會被激活,然後被破壞。

static int foo; 

塊內部僅在塊中可見,但它在整個生命週期中保留其值。

我正在做很多嵌入式C編碼,並且絕對禁止使用malloc()。這完全有可能。如果在編譯時不知道問題的大小,通常需要malloc()。但是,即使在某些情況下,這樣,您可以與其他techinques喜歡遞歸,基於行的處理等,等代替動態內存分配

+0

請注意,使用靜態數據通常與多線程不兼容。所以這可能不是一般性建議。 –

+0

雖然我們在建議其他選項,但alloca.h仍然是一個不錯的選擇。在堆棧上運行時獲取內存,仍然不需要手動釋放內存http://stackoverflow.com/questions/15639912/runtime-memory-allocation-on-stack – fayyazkl

0

這取決於你的意思是什麼

不能被更改或損壞沒有用戶請求

如果你指的是代碼 - 那麼它通常被稱爲客戶端,而不是用戶。目前還不清楚你的意思。但那不是重點。

關鍵是malloc()是用於動態內存分配的功能之一。這意味着您可以將此函數返回的地址傳遞到其他位置,並且存儲在那裏的數據將一直存在,直到手動釋放爲止。與靜態內存分配不同,靜態內存分配在超出範圍時自動釋放。

所以,你可能不應該使用malloc()如果由它分配的內存在同一範圍內被釋放,只是因爲它是毫無意義的,因爲靜態分配速度更快,因爲它是CPU緩存更容易,它是在程序啓動時初始化,不是在運行時作爲堆分配內存。