void *memcpy(
   void *dest,
   const void *src,
   size_t count 
);
这个如果count 大于dest的大小,使用的时候会造成写溢出;
如果count 大于src的大小的时候,会造成读溢出;
这个读溢出会出现什么后果?
我的想法是即使将不该有的东西读到没用的东西到dest里面去了也应该没什么关系,字符串以\0为结束,只要\0在里面就没问题,只是些脏了\0后面的内存.

解决方案 »

  1.   

    memcpy又不光是拷贝字符串的,和\0无关。读溢出的后果有两点:一是多了很多垃圾信息,造成逻辑错误。二是造成程序崩溃,因为有些内存是禁止读的,读到这些禁止读的内存会造成崩溃或抛异常。
      

  2.   

    memcpy这个函数,其作用就是复制一个指定大小的内存块到制定的内存块中。最好你还是不要异常,否则可能有些你意想不到的惊喜哦!
      

  3.   

    只要你的 count 超过 dest大小 或 src 大小 中的一个,运行起来时,不一定会立刻出错,但是随时会崩溃!系统禁止访问的内存地址,一旦你的程序企图进行读写操作,会导致程序崩溃。最好还是别冒这个险。研究问题可以,但应用上还是避免吧。 
      

  4.   

    哦,我想知道还有其它情况么,以前很少用到这个API,所以问下,还会出现其它情况么,多学习学习
      

  5.   

    这个memcpy函数内没有效验吗?
    对于非法的调用抛异常
    如果没有一点预防措施,那不符合传统编程思想啊:(
      

  6.   

    我举个第一条的例子,让lz加深印象:
    char *pDest = new char[20];
    char szSrc[] = "1111111111111111111111111111111111111111111111111111";
    ZeroMemory(pDest, 0);
    memcpy(pDest, szSrc, 30);
    //如果你在某处想释放这个pDest,即
    delete [] pDest;//程序会崩溃的
      

  7.   

    ZeroMemory(pDest, 20);笔误
      

  8.   

    缓冲区溢出,微软的很多漏洞就是这样导致。一般错误显示可能是非法内存访问,普通软件一般没啥大的影响,如果是系统的API有这样的错误在里面,恶意软件就可以构造一个缓冲区溢出的shellcode。具体你可以Google关键字shellCode.