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

 

posted @   轩~邈  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示