malloc函式分配記憶體失敗的原因及解決方法

2021-07-30 11:15:08 字數 2021 閱讀 1386

malloc()函式分配記憶體失敗的原因:

1. 記憶體不足。

2. 在前面的程式中出現了記憶體的越界訪問,導致malloc()分配函式所涉及的一些資訊被破壞。下次再使用malloc()函式申請記憶體就會失敗,返回空指標null(0)

stm32分配堆疊空間不足問題原因及解決方法

2.從不能分配的那個malloc()函式開始,往回找最近的那個能分配的malloc()函式,出問題的**應該就在這部分,很可能的原因就是指標越界,對未知的記憶體進行了操作,導致了malloc()不能繼續分配記憶體。

剛開始以為是由於第一次執行後的釋放記憶體操作沒有正常執行,導致浪費過多記憶體空間產生記憶體不足,嘗試了多種方式重寫釋放的函式,也查閱了free()函式的用法,證明使用方式正確。問題未解決

後來猜測由於指標變數釋放後沒有指向null,造成了野指標的情況。但是所有指標變數均為區域性變數,程式執行結束之後會自動釋放,並不會對下次造成影響。問題未解決

查閱網上的資料發現,malloc()記憶體分配失敗的原因,除了記憶體不足,還可能是之前產生了記憶體指標越界。

malloc()函式分配記憶體失敗的原因:

1. 記憶體不足。

2. 在前面的程式中出現了記憶體的越界訪問,導致malloc()分配函式所涉及的一些資訊被破壞。下次再使用malloc()函式申請記憶體就會失敗,返回空指標null(0)

在這個思想指導下,往前逐個查詢可能發生指標越界的函式

unsigned

char * strarray_valarray(char *pstrarray)

}

發現,宣告的pvalarrayunsigned char *型別的指標,由於sscanf()的第三個引數提示需要unsigned int *型別的變數,因此對pvalarray做了強制型別轉換,從unsigned char *變為了unsigned int *。雖然對於pvalarray來說,記憶體空間沒變(都為指標,32位系統分配4位元組),但是對於編譯器來說,所指向資料的含義就從unsigned char擴大到了unsigned int,之後通過指標遍歷訪問,對陣列進行更改就會造成指標越界,更改到未分配的區域。因此下次再使用malloc()函式申請記憶體就會失敗,返回空指標null(0)

因此將乾脆將pvalarray直接定義成unsigned int *型別的變數,並按照unsigned int型別分配空間,而不進行強制型別轉換。這樣就可避免指標越界的情況。測試發現問題不再發生。問題解決

如果下一次再碰到這樣的問題,就從不能分配的那個malloc()函式開始,往回找最近的那個能分配的malloc()函式,出問題的**應該就在這部分,很可能的原因就是指標越界,對未知的記憶體進行了操作,導致了malloc()不能繼續分配記憶體。

因此以後對指標的操作一定要萬分小心,防止指標越界問題的發生。

參考文章:

1. malloc函式申請記憶體失敗,返回空null(0):

2. 在記憶體充足時malloc函式分配記憶體失敗的原因及解決:

malloc分配的記憶體訪問失敗問題

問題描述 在vs中編寫c語言 再main函式中呼叫malloc的程式正常執行。放在另外乙個.c檔案裡總是報訪問失敗。char test char malloc 10 memset test,0,10 非常基礎的一句話。執行memset,訪問記憶體的時候總是異常。問題分析 當檢視記憶體的時候,偵錯程式...

記憶體充足時,malloc記憶體分配失敗問題

如題,為什麼記憶體充足時,malloc記憶體分配失敗?首先,在32位平台下,系統最多可管理4g記憶體,其中2g系統自用,剩下2g可供使用者使用,然而在實際分配時,使用者可用空間始終小於2g 若有童鞋在如上條件下分配空間 等於或大於2g可以聯絡我哦,以讓我糾正自己的錯誤 64位則可以管理好多,有興趣的...

記憶體分配函式分類

有 4種用於記憶體分配的 api函式。虛擬 virtual 函式用於分配和管理大數量的記憶體,堆函式 heap 用於小數量記憶體,全域性函式 global 及區域性函式 local 用於小數量記憶體分配,這兩類函式是為了實現與 16位系統相容而提供的。win32 api 仍然維護全域性以及區域性的堆...