memcpy和strcpy的区别
1. memcpy 函数
原型:void *memcpy(void *dest, const void *src, size_t n)
作用:把指针src
指向的内存内容的前n
个字节拷贝到指针dest
指向的内存中
(1)拷贝字符串数据至栈区字符数组和堆区指针
#include <stdio.h> #include <string.h> #include <stdlib.h> int main () { char srcName[]="Cristiano Ronaldo"; char destName1[100]; // 栈区字符数组,100字节 char *destName2 = (char *)malloc(strlen(srcName)+1); //堆区空间 strlen(srcName)+1 memcpy(destName1, srcName, strlen(srcName)+1); memcpy(destName2, srcName, strlen(srcName)+1); printf("srcName is %s\n", srcName); printf("destName1 is %s\n", destName1); printf("destName2 is %s\n", destName2); free(destName2); return 0; }
测试结果:
PS D:\Code\Data Structure> .\test.exe srcName is Cristiano Ronaldo destName1 is Cristiano Ronaldo destName2 is Cristiano Ronaldo
(2)拷贝结构体至堆区内存
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct student_info_s { int stuID; char *name; int math; }STUDENT_INFO_S; int main() { STUDENT_INFO_S studentA; studentA.stuID = 100; studentA.name = (char *)(void*) "Cristiano Ronaldo"; studentA.math = 98; STUDENT_INFO_S* pstudentB = (STUDENT_INFO_S*)malloc(sizeof(STUDENT_INFO_S)); if (NULL != pstudentB) { memcpy(pstudentB, &studentA, sizeof(studentA)); printf("After copy: B.studentID = %d, B.name = %s, B.mathscore = %d\n", pstudentB->stuID, pstudentB->name, pstudentB->math); } free(pstudentB); return 0; }
测试结果:
PS D:\Code\Data Structure> .\test.exe After copy: B.studentID = 100, B.name = Cristiano Ronaldo, B.mathscore = 98
2. strlcpy 函数
原型:size_t strlcpy (char *dest, const char *src, size_t size)
返回值:返回值是源字符串 src
的长度(不包括末尾的 \0
)
作用: strlcpy会将源字符串src
的内容复制到目标缓冲区dest
中,最多复制size - 1
个字符,并在目标缓冲区的末尾添加空字符\0
,以确保结果是一个有效
的 C 字符串。
#include <stdio.h> #include <string.h> #include <stdlib.h> /* 本地实现strlcpy函数 */ size_t strlcpy(char *dest, const char *src, size_t size) { size_t len = strlen(src); if (size == 0) { return 0; } if (len >= size) { memcpy(dest, src, size - 1); dest[size - 1] = '\0'; } else { memcpy(dest, src, len + 1); } return len; } int main () { const char srcName[]="Cristiano Ronaldo"; // 17个字母 char destName[18]; strlcpy(destName, srcName, sizeof(destName)); //拷贝18-1=17个字母,并在结尾加 '\0' printf("srcName is %s\n",srcName); printf("destName is %s\n",destName); return 0; }
测试结果:
PS D:\Code\Data Structure> .\test.exe srcName is Cristiano Ronaldo destName is Cristiano Ronaldo
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY