0

私には意味をなさない奇妙な問題に遭遇しました。

次のように定義された API に (文字列を含む) 構造体があります。

typedef struct sNCharcb
{
    char * pData;
    int    iDataLen;
}
tsNCharcb;

この構造体のディープ コピーを保存する必要があります。この構造体のコピーを作成するユーティリティ関数を作成しました。

inline sNCharcb rapi_strcpy(const sNCharcb &rapistr)
{
    sNCharcb res;

    res.pData = new char[rapistr.iDataLen];
    strcpy(res.pData, rapistr.pData);
    res.iDataLen = rapistr.iDataLen;

    return res;
}

このユーティリティ メソッドを使用してこれらの "sNCharcb" 構造体のコピーを作成し、それらを保存して親オブジェクトの変数を参照します。

stored_sNCharcb = rapi_strcpy(sNCharcb_to_copy);

しばらくすると、これらの格納された値は魔法のように変更され、ランダムなガベージが含まれるようになります。これらの値が格納される親オブジェクトは常にスコープ内にあり、破棄されません。これらの値が時期尚早に消去される原因は何ですか?

4

2 に答える 2

2

pDataNULLのデータは終端されていますか? そうでない場合、strcpy呼び出しがrapi_strcpy最後まで実行され、ターゲットに割り当てられたサイズを超えてコピーされている可能性があります。

strncpyおそらく、またはのような長さを強制するものを使用したいでしょうmemcpy:

strncpy(res->pData, rapistr.pData, rapistr.iDataLen);
于 2013-02-13T20:53:33.030 に答える
0

しばらくすると、これらの保存された値が魔法のように変更され、ランダムなゴミが含まれるようになります。

これが終了stored_sNCharcb時に有効であり、後で変更されると仮定すると、バッファオーバーフローなどが原因で、表示されていないコードが上書きされるべきではないときに上書きされていることを示します。終了後にデータブレークポイントを設定し、それが変更されているかどうかをデバッガーに通知させて、どのコードが変更しているかを正確に確認できるようにすることをお勧めします。rapi_strcpy()stored_sNCharcbstored_sNCharcbstored_sNCharcbrapi_strcpy()

于 2013-02-13T20:42:26.050 に答える