视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
memcpy
2025-09-27 16:21:53 责编:小OO
文档
memcpy

void *memcpy(void *dest, const void *src, size_t n);

1函数原型

void *memcpy(void *dest, const void *src, size_t n);

2功能

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

3所需头文件

C语言中使用#include ;

C++中使用#include 和#include 都可以。前者只是为了凸显C++风格。

4返回值

函数返回指向dest的指针。

5说

1.source和destin所指的内存区域可以重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针。

2.strcpy和memcpy主要有以下3方面的区别。

2.1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2.2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

2.3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

注意:source和destin都不一定是数组,任意的可读写的空间均可。

6函数实现

微软中:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24void * __cdecl memcpy (

        void * dst,

        const void * src,

        size_t count

        )

{

        void * ret = dst;

#if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC)

        {

        extern void RtlMoveMemory( void *, const void *, size_t count );

        RtlMoveMemory( dst, src, count );

        }

#else  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */

        /*

         * copy from lower addresses to higher addresses

         */

        while (count--) {

                *(char *)dst = *(char *)src;

                dst = (char *)dst + 1;

                src = (char *)src + 1;

        }

#endif  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */

        return(ret);

}

coreutils中:

void *memcpy (void *destaddr,void const *srcaddr, size_t len)

{

char *dest = destaddr;

char const *src = srcaddr;

while (len-- > 0)

{

*dest++ = *src++;

}

return destaddr;

}

Linux中:

void *memcpy(void *dest, const void *src, size_t count)

{

assert(dest != NULL && src != NULL);

char *tmp = dest; const char *s = src;

while (count--)

{

*tmp++ = *s++ ;

}

return dest;

}

程序例example1

作用:将s中的字符串复制到字符数组d中。

// memcpy.c

#include

#include

int main()

{

char *s="Golden Global View";

char d[20];

clrscr();

memcpy(d,s,( strlen(s)+1) );

printf("%s",d);

getchar();

return 0;

}

输出结果:Golden Global View

example2

作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始)

#include

int main(

{

char *s="Golden Global View";

char d[20];

memcpy(d,s+14,4); //从第14个字符(V)开始复制,连续复制4个字符(View) //memcpy(d,s+14*sizeof(char),4*sizeof(char));也可

d[4]='\\0';

printf("%s",d);

getchar();

return 0;

}

输出结果: View

example3

作用:复制后覆盖原有部分数据

#include

#include

int main(void)

{

char src[] = "******************************";

char dest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";

printf("destination before memcpy: %s\\n", dest);

memcpy(dest, src, strlen(src));

printf("destination after memcpy: %s\\n", dest);

return 0;

}

输出结果:

destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6

destination after memcpy: ******************************as6下载本文

显示全文
专题