Обновление 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);
}
Вторая версия вызывает исключение нарушения прав доступа для назначения. Я уверен, что это потому, что вторая версия распределяет память по-разному, но у меня начинает болеть голова, когда я пытаюсь понять, что и как и как это исправить. (В настоящее время я работаю над этим, динамически выделяя буфер того же размера, что и массив шаблонов, копируя шаблон в новый буфер, внося изменения в буфер, используя буфер вместо массива шаблонов, а затем пытаясь не забыть освободить «временный» буфер.)
(В частности, исходная версия привела массив шаблонов + смещение к DWORD * и присвоила ему константу DWORD для перезаписи четырех целевых байтов. Новая версия не может этого сделать, поскольку длина источника неизвестна - может быть не четыре байта - поэтому он использует memcpy вместо этого. Я проверил и перепроверил и убедился, что указатели на memcpy верны, но я все еще получаю нарушение прав доступа. Я использую memcpy вместо str (n) cpy потому что я использую простые символы (как массив байтов), а не символы Юникода и игнорирую нулевой терминатор. Использование присваивания, как указано выше, вызывает ту же проблему.)
Есть идеи?