memcpy()是C语言标准库中的一个函数,用于将一段内存中的内容复制到另一段内存中;

memcpy函数头文件

memcpy函数的头文件是 <string.h>。在使用memcpy函数之前,确保在你的 C 代码中包含这个头文件。

#include <string.h>

memcpy函数原型

#include <string.h>
void* memcpy(void* restrict s1,
	const void* restrict s2,
	size_t n);

memcpy函数将s2指向的对象中的n个字符复制到s1指向的对象;如果在重叠的对象之间进行复制,则行为未定义。

参数说明

  • s1:指向目标内存的指针,表示复制的目标位置;
  • s2:指向源内存的指针,表示要复制的数据来源;
  • n:要复制的字节数;当n为0时,函数不会执行任何复制操作;

返回值

返回目标内存的指针,也就是s1的值;

memcpy示例代码

该示例演示了如何使用memcpy()函数正确的复制字符串;

memcpy() 函数只是简单的按字节复制内存中的内容,不会考虑字符串的结构和终止符;所以在复制字符串时,要复制的长度应该为字符串的长度 +1;

#include <stdio.h>
#include <string.h>
#include <assert.h>

int main() {
	
	char str1[] = "hello world!";
	char str2[100];
	char* p;

	//将str1复制到str2中
	p = memcpy(str2, str1, strlen(str1) + 1);

	//memcpy返回的指针与str2相同
	assert(p == str2);

	printf("%s\n", str2);

}

程序运行结果

hello world!

memcpy常见错误

  • 源和目标内存重叠

    memcpy不处理源和目标内存区域重叠的情况。若源和目标指针指向的内存区域有重叠,使用memcpy可能导致未定义行为。

  • 不正确的字节数

    在调用memcpy时,如果传入的字节数(n)超出了目标内存区域的大小,可能导致缓冲区溢出,造成内存损坏或崩溃。

  • 忘记复制结束符

    当复制字符串时,通常需要复制字符串的结束符 \0。如果在memcpy中忘记加 +1,目标字符串将没有结束符,可能导致读取未定义的内存。

  • 使用未初始化的指针

    如果源或目标指针未初始化或指向无效的内存地址,调用memcpy将导致未定义行为。

  • 忘记包含头文件

    如果忘记包含<string.h>头文件,将导致编译器无法识别memcpy,从而出现编译错误。