【C语言函数】memcpy用法

memcpy用法:

memcpy函数是C和C++标准库中的一个内存拷贝函数,用于将一段内存区域的内容复制到另一段内存区域中。其基本用法如下:

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

参数说明:

  • dest: 指向目标内存区域的指针,即将接收源内存内容的位置。
  • src: 指向源内存区域的指针,即要复制的内容所在的起始位置。
  • n: 要拷贝的字节数。

示例代码:

#include <string.h> // 包含memcpy声明的头文件

// 假设我们有一个源数组和一个足够大的目标数组
char sourceArray[] = "Hello, World!";
char destinationArray[50];

// 使用memcpy复制13个字节(包括终止符'\0')
memcpy(destinationArray, sourceArray, 13);

// 现在destinationArray包含了与sourceArray相同的内容

注意事项:

  1. memcpy不检查重叠问题,如果目标区域和源区域有重叠部分,结果是未定义的。对于可能重叠的情况,应使用memmove函数。
  2. memcpy不会对目标内存进行初始化或清除,只是简单地覆盖指定大小的字节。
  3. 复制过程中不会执行类型转换,它纯粹按字节复制数据,所以当复制结构体或其他复杂类型时,需要确保目标类型与源类型兼容或者有足够的空间容纳所有字节。

 

说明

  1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。

  2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。


memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;

例:

  char a[100], b[50];

  memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。

  strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:

  char a[100], b[50];

strcpy(a,b);

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

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

 

memcpy与小端模式:

memcpy 是一个用于内存块复制的标准C库函数,它不关心数据在内存中的字节顺序,只是逐字节地将源内存区域的内容拷贝到目标内存区域。

小端模式(Little-Endian)和大端模式(Big-Endian)是处理器处理多字节数据时的两种不同字节序。在小端模式下,多字节数据的最低有效字节存储在最小地址处;而在大端模式下,最高有效字节存储在最小地址处。

当涉及到跨平台的数据交换或网络传输时,如果数据包含多字节整数(如int、long、float、double等),memcpy操作本身不会自动处理字节序问题。因此,在不同的CPU架构之间使用memcpy传递这类数据时,需要考虑字节序转换的问题。

例如,在一个32位的小端机器上,一个整数值0x12345678存储为:

Address:  | Low Addr | High Addr
Content:  | 0x78     | 0x56   | 0x34   | 0x12

 若要将这个值发送给大端机器上的另一个进程,仅通过memcpy拷贝数据可能会导致接收方读取到错误的数值(它会按照它的大端模式解释字节序)。在这种情况下,应先确保数据经过适当的字节序转换,然后再进行memcpy操作,或者在网络协议层面上采用标准的网络字节序(通常为大端字节序)。

代码示例:

//example1

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

  //memcpy.c

  #include<stdio.h>

  #include<string.h>

  intmain()

  {

  char*s="Golden Global View";

  chard[20];

  clrscr();

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

  d[strlen(s)]='\0';//因为从d[0]开始复制,总长度为strlen(s),d[strlen(s)]置为结束符

  printf("%s",d);

  getchar();

  return0;

  }

  //输出结果:GoldenGlobal View

//example2

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

  #include<string.h>

  intmain()

  {

  char*s="Golden Global View";

  chard[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();

  return0;

  }

  //输出结果: View

//example3

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

  #include<stdio.h>

  #include<string.h>

  intmain(void)

  {

  charsrc[] = "******************************";

  chardest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";

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

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

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

  return0;

  }

  //输出结果:

  //destinationbefore memcpy:abcdefghijlkmnopqrstuvwxyz0123as6

  //destinationafter memcpy: ******************************as6

 

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IIIIIII_II

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值