访问冲突使用memcpy或分配给Struct中的数组

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字符并忽略空终止符.使用上面的赋值会导致同样的问题.)

有任何想法吗?

AnT*_*AnT 7

尝试修改字符串文字是非法的.您的

Entries[0].pattern[2]='\x65'; 
Run Code Online (Sandbox Code Playgroud)

线尝试的确如此.在第二个示例中,您没有为字符串分配任何内存.相反,您正在使用指针(在struct对象中)直接指向字符串文字.字符串文字不可修改.

每天都会多次询问这个问题.读取为什么此字符串反转C代码导致分段错误?更多细节.