首页技术memcpy函数 使用memcpy函数需要注意的事项

memcpy函数 使用memcpy函数需要注意的事项

编程之家2026-06-271053次浏览

大家好,今天来为大家分享memcpy函数的一些知识点,和使用memcpy函数需要注意的事项的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

memcpy函数 使用memcpy函数需要注意的事项

关于memcpy()函数

取决于编译器memcpy实现的方式

一般有三种,从头复制从尾复制或者判断复制(等同于memmove)

仿照你的我写了一个测试程序

charmessage2[60]="abcdefghijklmnopqrstuvwxyz";

chartmp[60];

intmain()

memcpy函数 使用memcpy函数需要注意的事项

{

strcpy(tmp,message2);

printf("tmp=\"%s\"

",tmp);

memcpy(tmp+4,tmp+16,10);

printf("memcpy(tmp+4,tmp+16,10);>tmp=\"%s\"

memcpy函数 使用memcpy函数需要注意的事项

",tmp);

strcpy(tmp,message2);

memcpy(tmp+6,tmp+4,10);

printf("memcpy(tmp+6,tmp+4,10);>tmp=\"%s\"

",tmp);

strcpy(tmp,message2);

memcpy(tmp+4,tmp+6,10);

printf("memcpy(tmp+4,tmp+6,10);>tmp=\"%s\"

",tmp);

}测试结果如下

tmp="abcdefghijklmnopqrstuvwxyz"

memcpy(tmp+4, tmp+ 16, 10);> tmp="abcdqrstuvwxyzopqrstuvwxyz"

memcpy(tmp+6, tmp+4, 10);> tmp="abcdefefefijijmnqrstuvwxyz"

memcpy(tmp+4, tmp+6, 10);> tmp="abcdghijklmnopopqrstuvwxyz"

可以看到在memcpy(tmp+6, tmp+4, 10);时出现了覆盖efefef

说明我的编译器(gcc)在做memcpy的时候使用的是头复制即从起始地址开始复制

如果这个不出错而memcpy(tmp+4, tmp+6, 10);出错那么就是尾复制

都不出错的话那么就是判断之后智能复制相当于memmove

memcpy函数用法

memcpy函数用法如下:

memcpy函数是C/C++语言中的一个用于内存复制的函数,可以用于快速拷贝内存中的数据。它的语法:1void*memcpy(void*dest, const void*src, size_t n);

其中,第一个参数是目标地址,第二个参数是源地址,第三个参数是数据长度(单位是字节)。使用时需要注意,数据长度必须是整数倍,否则可能会出现错误。此外,该函数还有一个返回值,类型是void*,是一个指向dest的指针。

memcpy函数可以用来拷贝内存和字符串。例如,可以使用以下代码将一个字符数组src中的内容拷贝到另一个字符数组dest中

memcpy指的是C和C++使用的内存拷贝函数,函数原型为void*memcpy(void*destin, void*source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。

strcpy和memcpy主要有以下3方面的区别:

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

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

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

memcpy是什么意思

memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

Windows中

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

void* __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中

1

2

3

4

5

6

7

8

9

10

void* memcpy(void*destaddr,voidconst*srcaddr,size_tlen)

{

char* dest=destaddr;

char const* src=srcaddr;

while(len-->0)

{

*dest++=*src++;

}

return destaddr;

}

Linux中:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

void*memcpy(void*to, const void*from, size_t n)

{

void*xto= to;

size_t temp, temp1;

if(!n)

return xto;

if((long)to& 1){

char*cto= to;

const char*cfrom= from;

*cto++=*cfrom++;

to= cto;

from= cfrom;

n--;

}

if(n> 2&&(long)to& 2){

short*sto= to;

const short*sfrom= from;

*sto++=*sfrom++;

to= sto;

from= sfrom;

n-= 2;

}

temp= n>> 2;

if(temp){

long*lto= to;

const long*lfrom= from;

#if defined(CONFIG_M68000)|| defined(CONFIG_COLDFIRE)

for(; temp; temp--)

*lto++=*lfrom++;

#else

asm volatile(

" movel%2,%3\n"

" andw#7,%3\n"

" lsrl#3,%2\n"

" negw%3\n"

" jmp%%pc@(1f,%3:w:2)\n"

"4: movel%0@+,%1@+\n"

" movel%0@+,%1@+\n"

" movel%0@+,%1@+\n"

" movel%0@+,%1@+\n"

" movel%0@+,%1@+\n"

" movel%0@+,%1@+\n"

" movel%0@+,%1@+\n"

" movel%0@+,%1@+\n"

"1: dbra%2,4b\n"

" clrw%2\n"

" subql#1,%2\n"

" jpl 4b"

:"=a"(lfrom),"=a"(lto),"=d"(temp),"=&d"(temp1)

:"0"(lfrom),"1"(lto),"2"(temp));

#endif

to= lto;

from= lfrom;

}

if(n& 2){

short*sto= to;

const short*sfrom= from;

*sto++=*sfrom++;

to= sto;

from= sfrom;

}

if(n& 1){

char*cto= to;

const char*cfrom= from;

*cto=*cfrom;

}

return xto;

}

程序例example1

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

1

2

3

4

5

6

7

8

9

10

11

12

13

//memcpy.c

#include<stdio.h>

#include<string.h>

int main()

{

char* s="GoldenGlobalView";

char d[20];

clrscr();

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

printf("%s",d);

getchar();

return 0;

}

输出结果:Golden Global View

example2

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

1

2

3

4

5

6

7

8

9

10

11

#include<string.h>

int main(

{

char* s="GoldenGlobalView";

char d[20];

memcpy(d,s+12,4);//从第13个字符(V)开始复制,连续复制4个字符(View)

d[4]='\0';//memcpy(d,s+12*sizeof(char),4*sizeof(char));也可

printf("%s",d);

getchar();

return 0;

}

输出结果:View

example3

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

1

2

3

4

5

6

7

8

9

10

11

#include<stdio.h>

#include<string.h>

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

好了,文章到此结束,希望可以帮助到大家。

英雄榜魔兽世界?wow英雄榜国服人物查询2019英雄联盟全球总决赛冠军(2019年fpx夺冠成员)