malloc関数のメモリ割り当てに失敗した原因と解決方法

3754 ワード

malloc関数のメモリ割り当てに失敗した原因と解決方法
結論を先に述べるmalloc()関数のメモリ割り当てに失敗した原因:1.メモリ不足.2.前のプログラムでメモリの境界を越えたアクセスが発生し、malloc()割り当て関数に関連するいくつかの情報が破壊された.次にmalloc()関数を使用してメモリを申請すると失敗し、空のポインタNULL(0)に戻ります.
解决方法:1.STM 32の中でスタックの空间のメモリの不足の解决方法は私の前の文章を参考にすることができます
STM 32割付スタックスペース不足問題の原因と解決方法http://blog.csdn.net/lighthear/article/details/69485942
2.割り当てられないmalloc()関数から、最近割り当てられるmalloc()関数を探して、問題のコードはこの部分にあるはずです.ポインタが境界を越えて、未知のメモリを操作したため、malloc()がメモリを割り当て続けることができなくなった可能性があります.
問題
       最近、STM 32でチェーンテーブルを作成したとき、1回目は正常に動作し、2回目は正常に作成できないという問題が発生しました.オンラインデバッグではmalloc()関数がメモリに割り当てられていないことがわかりましたが、私は以前メモリ領域を大きくしすぎて、小さなデータもメモリ不足の場合はありません.
解決策
       最初は1回目の実行後にメモリを解放する操作が正常に実行されなかったため、メモリ空間を浪費しすぎてメモリ不足が発生したと考え、解放された関数を書き換える方法を試み、free()関数の使い方も調べ、使い方が正しいことを証明した.問題が解決しない
       その後,ポインタ変数が解放された後にNULLを指さなかったため,野ポインタの場合を推測した.ただし、すべてのポインタ変数はローカル変数であり、プログラムの実行が終了すると自動的に解放され、次回に影響を与えることはありません.問題が解決しない
       ネット上の資料を調べたところ、malloc()メモリの割り当てに失敗した原因は、メモリが不足しているほか、メモリポインタの境界を越えた可能性があることが分かった.malloc()関数のメモリ割り当てに失敗した原因:1.メモリ不足.2.前のプログラムでメモリの境界を越えたアクセスが発生し、malloc()割り当て関数に関連するいくつかの情報が破壊された.次にmalloc()関数を使用してメモリを申請すると失敗し、空のポインタNULL(0)に戻ります.
この思想指導の下で,ポインタの境界を越える可能性のある関数を1つずつ検索する.
unsigned char * StrArray_ValArray(char *pStrArray)
{
    int valArraySize = strlen(pStrArray) / 2;       
    unsigned char *pValArray;
    pValArray = (unsigned char *)malloc(sizeof(unsigned char) * valArraySize);
    for (int i = 0; i < valArraySize; i++)
    {
        sscanf(pStrArray + i * 2 ,"%2x",(unsigned int *)(pValArray + i));    //            
    }
}

       宣言されたpValArrayunsigned char *型のポインタであり、sscanf()の3番目のパラメータは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)を返します.http://blog.csdn.net/gadflycq/article/details/40752373 2.メモリが十分な場合、malloc関数のメモリ割り当てに失敗した原因と解決:http://blog.sina.com.cn/s/blog_71d3b5480100lxcx.html