Syn*_*ech 1 c++ memory refactoring access-violation data-structures
更新2:
好吧,我已经将我的解决方法重构为一个单独的函数.这样,虽然它仍然不理想(特别是因为我必须在函数外部释放函数内部分配的内存),它确实能够更普遍地使用它.我仍然希望有一个更优化和更优雅的解决方案...
更新:
好的,所以问题的原因已经确定,但我仍然对解决方案感到茫然.
我试图找出一种(简单/有效)方法来修改结构中数组的几个字节.我当前的解决方法是动态分配相同大小的缓冲区,复制数组,对缓冲区进行更改,使用缓冲区代替数组,然后释放缓冲区似乎过多且不太理想.如果我必须这样做,我也可以在结构中放入两个数组并将它们初始化为相同的数据,然后在第二个数据中进行更改.我的目标是减少内存占用(仅存储原始阵列和修改后的阵列之间的差异)和手动工作量(自动修补阵列).
原帖:
我昨晚编写的一个程序工作得很好,但是当我今天重构它以使其更具可扩展性时,我最终遇到了问题.
原始版本有一个硬编码的字节数组.经过一些处理后,一些字节被写入数组,然后进行了一些处理.
为了避免对模式进行硬编码,我将数组放在一个结构中,以便我可以添加一些相关数据并创建它们的数组.但是现在,我无法在结构中写入数组.这是一个伪代码示例:
main() {
char pattern[]="\x32\x33\x12\x13\xba\xbb";
PrintData(pattern);
pattern[2]='\x65';
PrintData(pattern);
}
Run Code Online (Sandbox Code Playgroud)
那一个有效,但这个没有:
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);
}
Run Code Online (Sandbox Code Playgroud)
第二个版本导致分配上的访问冲突异常.我确定这是因为第二个版本以不同的方式分配内存,但是我开始变得头疼,试图弄清楚什么或如何解决这个问题.(我目前正在通过动态分配与模式数组大小相同的缓冲区,将模式复制到新缓冲区,对缓冲区进行更改,使用缓冲区代替模式数组,然后解决它试图记住释放临时缓冲区.)
(具体来说,原始版本将模式数组 - + offset-转换为DWORD*并为其分配一个DWORD常量来覆盖四个目标字节.新版本不能这样做,因为源的长度未知 - 可能不是四个字节 - 所以它使用memcpy.我已经检查并重新检查并确保指向memcpy的指针是正确的,但我仍然遇到访问冲突.我使用memcpy而不是str(n)cpy因为我是使用普通字符(作为字节数组),而不是Unicode字符并忽略空终止符.使用上面的赋值会导致同样的问题.)
有任何想法吗?
尝试修改字符串文字是非法的.您的
Entries[0].pattern[2]='\x65';
Run Code Online (Sandbox Code Playgroud)
线尝试的确如此.在第二个示例中,您没有为字符串分配任何内存.相反,您正在使用指针(在struct对象中)直接指向字符串文字.字符串文字不可修改.
每天都会多次询问这个问题.读取为什么此字符串反转C代码导致分段错误?更多细节.