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

C语言使用技巧(二十八):回顾memcpy()函数用法

所需头文件:#include <string.h>
memcpy() 用来复制内存,其原型为:

void * memcpy ( void * dest, const void * src, size_t num );

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

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

需要注意的是:
dest 指针要分配足够的空间,也即大于等于 num 字节的空间。如果没有分配空间,会出现断错误。
dest 和 src 所指的内存空间不能重叠(如果发生了重叠,使用 memmove() 会更加安全)。

与 strcpy() 不同的是,memcpy() 会完整的复制 num 个字节,不会因为遇到“\0”而结束。【返回值】返回指向 dest 的指针。注意返回的指针类型是 void,使用时一般要进行强制类型转换。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N (10) //给p2分配了10个字节的内存空间
int main()
{
    char* p1 = "2022abcde2022";//p1指向一个字符串字面值
    char* p2 = (char*)malloc(sizeof(char) * N);
    //指针p3通过函数memcpy直接指向了指针p2所指向的内存,也就是说指针p2、p3指向了同一块内存。然后打印p2,p3指向的内存值,结果是相同的。
    char* p3 = (char*)memcpy(p2, p1, N);
    printf("p2 = %s\np3 = %s\n", p2, p3);
    free(p2);//惯释放p2
    p2 = NULL;
    p3 = NULL;//把p3也置为NULL是为了防止再次访问p3指向的内存,导致野指针的发生。
    // system("pause");
    return 0;
}

执行结果:

gcc mey.c -o mey && ./mey
p2 = 2022abcde2
p3 = 2022abcde2

其中:free()函数是cstdlib标头的库函数。 它用于取消分配动态分配的内存块(即,由malloc() , calloc()或realloc()函数分配的内存块),以便可以将这些内存块用于进一步的分配。 它接受一个参数,该参数应该是指向已分配内存的指针。
注意:如果指针未指向动态分配的内存,则它将导致未定义的行为;如果指针为空,则free()函数将不执行任何操作。

参考:
https://blog.csdn.net/qq_21792169/article/details/50561570
https://blog.csdn.net/cumt30111/article/details/107765170

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言使用技巧(二十九):回顾fopen,fwrite,fread,fseek,fclose,ftell,fputs,gets,rewind,fprintf函数用法
  • 桌面端的移动运算(三)
  • C语言使用技巧(三十):计算程序运行时间以及自带的函数库calcElapsed(startTime, now())
  • 桌面端的移动计算(四)
  • C/C++音频算法: noise suppression算法及技术资料汇总
  • 经济观察报:新浪打造网络新闻的工业化实验
  • AI模型设计:C++实现深度学习神经网络模型及源码分享
  • C语言使用技巧(三十一):回顾strlen函数简单使用
  • 导航界面
  • python使用技巧(二十七):音频WAV和PCM的互相转换
  • Java学习备忘录(一)安装篇(原创)
  • C语言使用技巧(三十二):读写txt文件指定行指定所有行类型数据
  • AI模型设计:安装C++版本的libtensorflow(1.10~2.6.0)以及TFC++ demo源码的实现
  • 酒店管理(链表和文件操作)
  • AI模型设计:配置C++版本pytorch(libtorch 1.12)开发环境以及demo源码的实现
  • JS 中的深拷贝与浅拷贝
  • [deviceone开发]-do_Webview的基本示例
  • 【前端学习】-粗谈选择器
  • 2017届校招提前批面试回顾
  • gulp 教程
  • Java面向对象及其三大特征
  • JS专题之继承
  • Laravel 菜鸟晋级之路
  • node.js
  • node入门
  • PHP那些事儿
  • 诡异!React stopPropagation失灵
  • 开源地图数据可视化库——mapnik
  • 巧用 TypeScript (一)
  • 一份游戏开发学习路线
  • 赢得Docker挑战最佳实践
  • Spring第一个helloWorld
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 如何用纯 CSS 创作一个货车 loader
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • # .NET Framework中使用命名管道进行进程间通信
  • #162 (Div. 2)
  • #Linux(帮助手册)
  • #window11设置系统变量#
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (BFS)hdoj2377-Bus Pass
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (备份) esp32 GPIO
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (九)c52学习之旅-定时器
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)jQuery 基础
  • ***利用Ms05002溢出找“肉鸡
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net core Swagger 过滤部分Api
  • .Net Core 微服务之Consul(二)-集群搭建
  • .Net Core 中间件验签
  • .net core控制台应用程序初识