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