更新 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 因为我是使用普通字符(作为字节数组),而不是 Unicode 字符并忽略空终止符。使用上述赋值会导致同样的问题。)
有任何想法吗?