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)
}
發現,宣告的pvalarray
為unsigned 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 仍然維護全域性以及區域性的堆...