当前位置: 首页 > java >正文

c/c++拷贝函数

memcpy()函数

  • 概要
原型
void * memcpy ( void * dest, const void * src, size_t num );
功能

memcpy()会复制 src 所指的内存内容的前 num 个字节到 dest所指的内存地址上(memcpy()并不关心

被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据

类型进行复制

注意

1.dest 指针要分配足够的空间,也即大于等于 num字节的空间。
2.dest 和 src所指的内存空间不能重叠(重叠可能会导致拷贝数据错误)

3.memcpy拷贝结束后不会给dest末尾添加‘/0’

4.memcpy 不会检查 src 或 dest 的实际内存边界,它只是机械地复制 num 字节(num大于小于dest和

src的长度都不会阻止),在vs2022会报警告。

返回值返回指向 dest 的指针。注意返回的指针类型是void*,使用时一般要进行强制类型转换。
  • 举个例子
int main() 
{const char* p1 = "HEllO";char* p2 = (char*)malloc(sizeof(char) * 10);char* p3 = (char*)memcpy(p2, p1, 6);cout << p3 << endl;
}

 memmove函数

  •  概要
原型
void *memmove(void *dest, const void *src, size_t num);
功能memmove()会复制 src 所指的内存内容的前 num 个字节到 dest所指的内存地址上
注意

1.memmove() 更为灵活,当src 和 dest所指的内存区域重叠时,memmove() 仍然可以正确的处理,

不过执行效率上会比使用 memcpy()略慢些。(处理方式就是如果src长度小于dest,就从头开始复制

,如果src长度大于dest,就从后往前复制,这样就可以保证内存区域重叠时正确复制

2.memmove的特性基本上和memcpy一致。

返回值

返回指向 dest 的指针。注意返回的指针类型是void,使用时一般要进行强制类型转换

  • 举个例子
int main() 
{char str[] = "memmove can be very useful......";memmove(str + 20, str + 15, 11);puts(str);return 0;
}

strcpy()函数

  • 概要
原型
char*strcpy(char *dest, const char *src);
功能

strcpy() 把src所指的由"/0"结束的字符串复制到dest 所指的数组中,返回指向dest 字符串的起始地址

(连同"/0")

注意

1.如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(bufferOverflow)的错误情况,在编写

程序时需要特别留意,或者用strncpy()来取代

2.strcpy 不会检查 src 或 dest 的实际内存边界,它只是机械地复制,在vs2022中超出边界会程序

崩溃

返回值指向dest 字符串的起始地址

 

  • 举个例子 
int main() 
{char str1[] = "Sample string";char str2[8];char str3[40];strcpy(str2, str1);strcpy(str3, "copy successful");printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);return 0;}

strncpy()函数

  • 概要
原型
char *strncpy(char *dest, const char *src, size_t n);
功能 strncpy()会将字符串src前n个字符拷贝到字符串dest,n也表示最多复制n个字符。
注意

1.不像strcpy(),strncpy()不会向dest追加结束标记'\0',这就引发了很多不合常理的问题。

2.如果n大于src的长度,会用"/0"填充dest。

返回值指向dest 字符串的起始地址
  • 举个例子
int main(void)
{char dest3[100] = "xxxxxxxxxxxxxxxxxxxxxxxxx";const char src3[6] = "abcxy";int n3 = 20;strncpy(dest3, src3, n3); return 0;
}

http://www.xdnf.cn/news/15120.html

相关文章:

  • 字节豆包又一个新功能,超级实用,4 种玩法,你肯定用得上!(建议收藏)
  • 力扣_二叉搜索树_python版本
  • 聚焦数据资源建设与应用,浙江省质科院赴景联文科技调研交流
  • 【龙泽科技】新能源汽车维护与动力蓄电池检测仿真教学软件【吉利几何G6】
  • Elasticsearch 滚动(Scroll)用法、使用场景及与扫描(Scan)的区别
  • DIDCTF-蓝帽杯
  • 【经典面经】C++新特性 TCP完整收发数据 TLS1.2 TLS1.3
  • 【C++】全套数据结构算法-线性表讲解(1)
  • Anaconda及Conda介绍及使用
  • 注意力机制十问
  • 简单记录一下Debug的折磨历程
  • 汽车级MCU选型新方向:eVTOL垂桨控制监控芯片的替代选型技术分析
  • 巨人网络持续加强AI工业化管线,Lovart国内版有望协同互补
  • UI前端大数据可视化实战技巧:如何利用数据故事化提升用户参与度?
  • 云暴露面分析完整指南
  • Qt:布局管理器Layout
  • [Meetily后端框架] 多模型-Pydantic AI 代理-统一抽象 | SQLite管理
  • React 核心知识点速览:从基础到关键概念
  • 7.12 卷积 | 最小生成树 prim
  • 手把手一起使用Miniforge3+mamba平替Anaconda(Win10)
  • mac电脑的usr/libexec目录是干什么的?
  • 基于redis的分布式session共享管理之销毁事件不生效问题
  • JavaSE——面向对象基础
  • 分布式系统高可用性设计-负载均衡与容错机制深度解析
  • Rust基础-part3-函数
  • 【硬核】6节串联锂电池均衡系统仿真_组内双向cuk均衡_组间双向反激式变压器
  • Go 编译报错排查:vendor/golang.org/x/crypto/cryptobyte/asn1 no Go source files
  • Android原生TabLayout使用技巧
  • Telnet远程连接实验(Cisco)
  • jenkins部署springboot+Docker项目