2

2D 動的 char 配列を設定する単純なプログラムがあります。割り当ては通常どおり機能します。私の問題は、配列の解放に依存しています。VC++ 2008 でピュア C を使用しています。

これは、配列を割り当てて初期化するときのコードです。

char** messsages = (char**)malloc(5*sizeof(char*));
initValorArrayMsgs(messsages, 5);

insertMsgToArray(5, messsages , "Test message.");

void insertMsgToArray(int totalLines, char** msgsArray, const char* msgToInsert)
{
    int line = 0;
    int size= strlen(msgToInsert);

    for(; line < totalLines; line ++)
    {
        if(strlen(msgsArray[line ]) == 0)
        {
            msgsArray[line ] = (char*)malloc(sizeof(char) * size);
            strcpy(msgsArray[line], msgToInsert);
            break;
        }
    }
}

そして、これは配列を解放するコードです

void freeArrayMsgs(char** arry, int lines)
{
    int i = 0;
    for(; i < lines; i++)
    {
        if(strlen(arry[i]) == 0){
            break;
        }
        free(arry[i]);
    }
    free(arry);
}

プログラムが最初の配列を解放しようとすると、ヒープ破損例外が発生します。

SOに関するいくつかの投稿を読んで、アレイを正しく解放しています。では、なぜ hep 破損の例外が発生するのでしょうか?

4

2 に答える 2

3

いくつかのこと:

  • malloc(size + 1)null ターミネータを合わせる必要があります。
  • する必要はありませんsizeof(char)-sizeofは で定義されているcharため、常に 1 になります。
  • 結果をキャストするべきではありませんmalloc- それは不要であり、問​​題を隠す可能性があります。
  • 初期化されていないためmsgsArray、保証はありませんstrlen(msgsArray[line]) == 0。実際、おそらくそうではないでしょう。これを真にしたい場合は、callocの代わりに使用してください。malloc
  • 一般に、strncpy代わりにstrcpy- を使用すると安全です。
  • を使用するよりも、 を に初期化してをチェックstrlenする方がよいでしょう。最初の文字列が空の文字列で、残りが実際の文字列の場合はどうなるでしょうか? あなたのコードはループを終了します。char*nullnullmsgToInsertstrlen(msgs[0]) == 0null
于 2013-08-29T15:18:01.897 に答える