更新 2:
さて、私が持っている回避策を別の関数にリファクタリングしました。このように、まだ理想的ではありませんが (特に、関数内で割り当てられたメモリを関数外で解放する必要があるため)、もう少し一般的に使用することができます。私はまだ、より最適でエレガントなソリューションを望んでいます...
更新:
さて、問題の原因は特定されましたが、まだ解決策がありません。
構造体の配列の数バイトを変更する (簡単で効果的な) 方法を見つけようとしています。同じサイズのバッファーを動的に割り当て、配列をコピーし、バッファーを変更し、配列の代わりにバッファーを使用してから、バッファーを解放するという私の現在の回避策は、過剰であり、最適ではないようです。このようにする必要がある場合は、構造体に 2 つの配列を配置し、両方を同じデータに初期化して、2 番目の配列を変更することもできます。私の目標は、メモリ フットプリント (元の配列と変更された配列の違いだけを格納する) と手作業の量 (配列に自動的にパッチを適用する) の両方を削減することです。
元の投稿:
昨夜、問題なく動作するプログラムを書きましたが、今日それをリファクタリングして拡張性を高めたところ、問題が発生しました。
元のバージョンには、ハードコードされたバイト配列がありました。いくつかの処理の後、いくつかのバイトが配列に書き込まれ、さらにいくつかの処理が行われました。
パターンのハードコーディングを避けるために、配列を構造体に入れ、関連するデータを追加してそれらの配列を作成できるようにしました。しかし、今、構造体の配列に書き込むことができません。疑似コードの例を次に示します。
main() {
char pattern[]="\x32\x33\x12\x13\xba\xbb";
PrintData(pattern);
pattern[2]='\x65';
PrintData(pattern);
}
それは機能しますが、これは機能しません:
struct ENTRY {
char* pattern;
int somenum;
};
main() {
ENTRY Entries[] = {
{"\x32\x33\x12\x13\xba\xbb\x9a\xbc", 44}
, {"\x12\x34\x56\x78", 555}
};
PrintData(Entries[0].pattern);
Entries[0].pattern[2]='\x65'; //0xC0000005 exception!!! :(
PrintData(Entries[0].pattern);
}
2 番目のバージョンでは、割り当てでアクセス違反の例外が発生します。2番目のバージョンではメモリの割り当てが異なるためだと思いますが、何が何であるか、またはこれを修正する方法を理解しようとして頭が痛くなり始めています。(私は現在、パターン配列と同じサイズのバッファーを動的に割り当て、パターンを新しいバッファーにコピーし、バッファーに変更を加え、パターン配列の代わりにバッファーを使用して、それから(一時的な) バッファを解放することを忘れないようにします。)
(具体的には、元のバージョンはパターン配列 +offset を DWORD* にキャストし、それに DWORD 定数を割り当てて 4 つのターゲット バイトを上書きします。ソースの長さが不明であるため、新しいバージョンではそれができません。 memcpy の代わりに memcpy を使用します.memcpy へのポインターが正しいことを確認しましたが、まだアクセス違反が発生します. Unicode char ではなくプレーン char (バイトの配列として) を使用し、null ターミネータを無視します。上記の代入を使用すると、同じ問題が発生します。)
何か案は?