分享

更多

   

memcpy和strcpy的区别

2012-07-31  英子电气
strcpy和memcpy都是用于从一块内存复制一段连续的数据到另一块内存,区别是终结标识不同。
strcpy(a, b)从b复制内容到a,然后从b+1复制内容到a+1,依次类推,知道b+i的内容是'\0'。要小心的是1:确保b是以'\0'结尾的字符串;2:确保a开始有足够的可用内存。通常用strncpy(a, b, c)会好一些,这时复制的数据最长不超过c字节。

memcpy(a, b, c)从b开始复制c字节内容到a。相比strcpy,memcpy是确定复制c个字节的。所以只要保证b开始有c字节有效数据,a开始有c字节内存空间就行。
要小心的是:memcpy对于重叠内存的复制支持不太好。重叠内存是指
char a[10]的话,memcpy(a, a + 3, 5)这样的,源数据是a+3到a+7,目标位置是a到a+5,有重复。
如果希望覆盖,可以用memmove。

 

用法:#include <string.h>
 
  功能:由src所指内存区域复制count个字节到dest所指内存区域。
 
  说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
 
  举例:

      // memcpy.c
     
      #include <syslib.h>
      #include <string.h>

      main()
      {
        char *s="Golden Global View";
        char d[20];
       
        clrscr();
       
        memcpy(d,s,strlen(s));
        d[strlen(s)]=0;
        printf("%s",d);

        getchar();
        return 0;
      }
      而strcopy复制字符串不检查字符串长度,经常造成缓冲区溢出,请谨慎使用
前面是拷贝字符串,后面是拷贝内存内容。
能用strcpy的地方肯定能用memcpy,反过来不成立。strcpy拷贝时遇到'\0'就结束,而memcpy则拷贝指定长度的内存数据,而不管是否有'\0'
strcpy是拷贝字符串,以\0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止)
strcpy的原型为
char *strcpy(char *dest, const char *src)
而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么(不仅限于字符)
memcpy的原型为
void *memcpy(void *dest, const void *src, size_t n);
1.strcpy: 从src向dest拷贝字符,一个一个拷贝,当在src内发现绝对0['\0']的时候,拷贝结束,在dest目标指针的最后也会加上一个绝对0['\0'];这个绝对0很有用...
2.memcpy:从src向dest一个字节一个字节的拷贝,当拷贝完第3个参数指定的长度之后,拷贝结束,也可以对memcpy做优化,4个字节拷贝...

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢
    发表评论评论公约
    喜欢该文的人也喜欢 更多