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
,从而出现编译错误。