C ++ memcpy问题:(

时间:2010-06-03 18:05:26

标签: c++ c memcpy

我有一个问题,我的memcpy的src指针指向错误。

unsigned char* lpBuffer是一个包含我的字节的缓冲区,我用olly检查。

代码:

 IMAGE_DOS_HEADER iDOSh;
 memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));

问题是lpBuffer指出错误,调试器的输出是

dest = 002859E8 RIGHT
src = 000001D8 FALSE

src指向无效:(我不知道为什么

感谢您阅读

3 个答案:

答案 0 :(得分:4)

为什么要检查 ollydbg 但不是更方便?跟踪 IDE 中的步骤。将指针的值传递给memcpy函数时,它无法更改变为无效(因为它是按值传递的),因此它意味着它在memcpy调用之前一直无效。

不幸的是,您的代码只涵盖了明显的memcpy来电,其中 “没有任何问题可以解决”。

另外要指出的是,指针的奇怪0x00000YY值实际上表明出现了问题,并且可能在代码(或类似的东西)中的某处存在无效的类型转换。 < / p>

答案 1 :(得分:1)

我认为你正在调试程序集调用C函数并尝试使用ollydbg跟踪它(我只是查看它是什么并基于它们的功能列表中的这个假设)。这很难做到。

我建议您这样做:

...
void print_ptr(void * p) {
     fprintf(stderr, "%p\n", p);
}
...
    IMAGE_DOS_HEADER iDOSh;

    print_ptr(lpBuffer);
    memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));
    print_ptr(lpBuffer);

如果你实际上无法打印好的东西。只需将函数extern设置为带有问题的memcpy的文件,它将强制编译器将值加载到包含第一个参数的位置。您应该能够在调试器中观察到这一点。

memcpy(来自任何合理的C库)实际上做错的可能性非常低。

如果我不得不猜测出现了什么问题,那么lpBuffer实际上不应该是void *而是内存位置的链接器标签。在这种情况下,您可以尝试将其声明为:

extern char lpBuffer[];

并将你的memcpy作为

memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));

extern IMAGE_DOS_HEADER lpBuffer;

并将你的memcpy作为

memcpy(&iDOSh,&lpBuffer,sizeof(iDOSh));

答案 2 :(得分:0)

在您致电lpBuffer之前立即检查memcpy的值,然后立即再次检查lpBuffer。它改变了吗?

如果它发生了变化,唯一可以改变memcpy中值的是memcpy,这意味着你在调用中覆盖了它(即它没有做你认为它正在做的事情...仔细检查你的参数。)

我的猜测是,看看你的代码可能在调用lpBuffer时没有改变。也就是说,如果在显示它之前和之后立即检查memcpy的值,则会在调用{{1}}之前无意中更改它。您需要跟踪该更改。