1

文字配列へのポインターを持つ単純な C プログラムがあります。それを開始するには、 を使用mallocし、サイズを変更してから、後でプログラムで x 回設定します。

でサイズを一度変更するとreallocgdbはエラーを表示しませんが、サイズ変更関数を再度呼び出すと、gdbは次のエラーを表示します。

warning: Invalid Address specified to RtlReAllocateHeap( 003E0000, 00404076 )

サイズを複数回変更すると、このエラーが発生する理由はありますか?

編集

いろいろいじってみたところ、リサイズ後のポインタデータの設定をコメントアウトしてもエラーにはならないようです。

void setName(struct class_x *class, char *name)
{
    class->name = (char *) reallocateMemory(class->name, sizeof(char) * strlen(name) + 1);
    class->name = name;
}

void *reallocateMemory(void *member, size_t size)
{
    void *tmp = realloc(member, size);
    if(tmp == NULL)
    {
        //handle
    }
    return tmp;
}
4

2 に答える 2

3

class->name = nameあなたが思っていることをしていません。strncpy()新しく割り当てられたメモリに入力文字列をコピーするために使用します。そこにある割り当ては、割り当てられたメモリをリークし、ポインターを上書きしています。次に を呼び出すと、 から取得していないポインターでsetName()呼び出すことになります。定数、グローバル変数、またはローカル変数の文字列を使用して呼び出していると予想されますが、それが最終的にエラーを生成します。からメモリを取得した文字列のみを呼び出していた場合、gdb からの警告は表示されません (ただし、バグは残っています!)。realloc()malloc()setName()setName()malloc()

于 2010-02-06T18:32:37.610 に答える