C语言第二十七弹---内存函数

这篇具有很好参考价值的文章主要介绍了C语言第二十七弹---内存函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言第二十七弹---内存函数,C语言详解,c语言,开发语言

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

内存函数

1、memcpy 使用和模拟实现

2、memmove 使用和模拟实现

3、memset 函数的使用

4、memcmp 函数的使用

总结


前面两弹讲解了字符函数和字符串函数,但是在我们实际运用中不仅仅只有这些函数,因此下面我们继续需要几个常见的内存函数。

1、memcpy 使用和模拟实现

void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
num为拷贝的字节数。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
返回值为目标空间首地址。
#include <stdio.h>
#include <string.h>
int main()
{
 int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
 int arr2[10] = { 0 };
 memcpy(arr2, arr1, 20);
 int i = 0;
 for (i = 0; i < 10; i++)
 {
 printf("%d ", arr2[i]);
 }
 return 0;
}
C语言第二十七弹---内存函数,C语言详解,c语言,开发语言
对于重叠的内存,交给memmove来处理。
但是在VS 2022中memcpy也可以解决重叠内存情况。
memcpy函数的模拟实现:
根据前面两弹讲的五个函数模拟实现考虑点,依次进行思考

1.参数顺序

2.const修饰指针(防止指针被修改)
3.函数的功能,停止条件

4.assert(对空指针进行判断)
5.函数返回值

思想:从前往后依次按照char类型拷贝,不能解决内存重叠问题。
void * memcpy ( void * dst, const void * src, size_t count)
{
 void * ret = dst;
 assert(dst);//空指针报错
 assert(src);//空指针报错
 /*
 * copy from lower addresses to higher addresses
 */
 while (count--) {
 *(char *)dst = *(char *)src;//强转成char*类型,再解引用给目标空间
 dst = (char *)dst + 1;//目标空间向前移动
 src = (char *)src + 1;//原来空间向前移动
 }
 return ret;
}

2、memmove 使用和模拟实现

void * memmove ( void * destination, const void * source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
#include <stdio.h>
#include <string.h>
int main()
{
 int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
 memmove(arr1+2, arr1, 20);
 int i = 0;
 for (i = 0; i < 10; i++)
 {
 printf("%d ", arr2[i]);
 }
 return 0;
}
输出的结果:
C语言第二十七弹---内存函数,C语言详解,c语言,开发语言
memmove的模拟实现:
要处理内存重叠问题,因此需要考虑两种情况,如果内存不重叠,从前往后拷贝即可,如果内存重叠,可以从后往前拷贝。
C语言第二十七弹---内存函数,C语言详解,c语言,开发语言
void * memmove ( void * dst, const void * src, size_t count)
{
 void * ret = dst;
 if (dst <= src || (char *)dst >= ((char *)src + count)) {
 /*
 * Non-Overlapping Buffers
 * copy from lower addresses to higher addresses
   不重叠情况 从前往后拷贝 
 */
 while (count--) {
 *(char *)dst = *(char *)src;
 dst = (char *)dst + 1;
 src = (char *)src + 1;
 }
 }
 else {
 /*
 * Overlapping Buffers
 * copy from higher addresses to lower addresses
   重叠情况  从后往前拷贝
 */
 dst = (char *)dst + count - 1;
 src = (char *)src + count - 1;
 while (count--) {
 *(char *)dst = *(char *)src;
 dst = (char *)dst - 1;
 src = (char *)src - 1;
 }
 }
 return(ret);
}

3、memset 函数的使用

void * memset ( void * ptr, int value, size_t num );
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。
ptr 指向要填充的内存块的指针。

value为要设置的值。该值以 int 形式传递,但该函数使用此值的无符号 char 转换填充内存块。

num 为要设置为值的字节数。size_t 是一个
无符号的整数类型。
#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] = "hello world";
 memset (str,'x',6);
 printf(str);
 return 0;
}
输出的结果:
C语言第二十七弹---内存函数,C语言详解,c语言,开发语言

4、memcmp 函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
较从ptr1和ptr2指针指向的位置开始,向后的num个字节

比较两个内存块
将 ptr1 指向的内存块的第一个 num 个字节与 ptr2 指向的第一个 num 个字节进行比较,如果它们都匹配,则返回零,如果它们不匹配,则返回一个与零不同的值,表示哪个值更大。

请注意,与 strcmp 不同,该函数在找到 null 字符后不会停止比较。

返回值如下:
C语言第二十七弹---内存函数,C语言详解,c语言,开发语言
<0  在两个内存块中不匹配的第一个字节在 ptr1 中的值低于 ptr2 中的值(如果计算为 unsigned char 值)
0    两个存储块的内容相等
>0  两个内存块中不匹配的第一个字节在 ptr1 中的值大于 ptr2 中的值(如果计算为无符号字符值)
#include <stdio.h>
#include <string.h>
int main()
{
 char buffer1[] = "DWgaOtP12df0";
 char buffer2[] = "DWGAOTP12DF0";
 int n;
 n = memcmp(buffer1, buffer2, sizeof(buffer1));
 if (n > 0) 
 printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
 else if (n < 0) 
 printf("'%s' is less than '%s'.\n", buffer1, buffer2);
 else
 printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
 return 0;
}

C语言第二十七弹---内存函数,C语言详解,c语言,开发语言

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!文章来源地址https://www.toymoban.com/news/detail-827271.html

到了这里,关于C语言第二十七弹---内存函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SQL开发实战技巧】系列(二十七):数仓报表场景☞通过对移动范围进行聚集来详解分析函数开窗原理以及如何一个SQL打印九九乘法表

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月09日
    浏览(38)
  • C语言第二十五弹---字符函数和字符串函数(上)

      ✨ 个人主页:   熬夜学编程的小林 💗 系列专栏:   【C语言详解】   【数据结构详解】 目录 1、字符分类函数 2、字符转换函数 3、strlen的使用和模拟实现 4、strcpy 的模拟实现 5、strcat 的模拟实现 6、strcmp 的模拟实现 7、strncpy 函数的使用 总结 在编程的过程中,我们经常

    2024年02月19日
    浏览(33)
  • C语言第二十六弹---字符串函数(下)

    ✨ 个人主页:   熬夜学编程的小林 💗 系列专栏:   【C语言详解】   【数据结构详解】 目录 1、strncat 函数的使用 2、strncmp 函数的使用 3、strstr 函数的使用和模拟实现 4、strtok 函数的使用 5、strerror 函数的使用 6、perror 函数的使用 总结 • Appends the first num characters of sourc

    2024年02月20日
    浏览(34)
  • MFC第二十七天 通过动态链表实现游戏角色动态增加、WM_ERASEBKGND背景刷新的原理、RegisterClass注册窗口与框架程序开发

    WM_ERASEBKGND是一种消息类型,它是在窗口需要重绘背景时发送给窗口的。背景刷新的原理是在窗口绘制之前,系统首先向窗口发送WM_ERASEBKGND消息,窗口可以在处理此消息时进行背景擦除操作,即清除原有的背景后。系统会发送WM_PAINT消息,窗口可以在处理此消息时进行绘制操作

    2024年02月14日
    浏览(22)
  • 第二十七章 Unity碰撞体Collision(下)

    本章节我们继续研究碰撞体,并且探索一下碰撞体与刚体之间的联系。我们回到之前的工程,然后给我们的紫色球体Sphere1也添加一个刚体组件。如下所示 此时,两个球体都具备了碰撞体和刚体组件。接下来,我们Play运行查看效果 我们发现,黄球碰撞紫球之后,两者都向右移

    2024年02月09日
    浏览(29)
  • 【LeetCode75】第二十七题(933)最近的请求次数

    目录 题目: 示例: 分析: 代码+运行结果: 首先这是LeetCode75里第一道设计类的题目,这种类型的题目会比较新颖,就是按照题目要求来设计一个类。然后测试用例是模拟真实调用类的成员函数的。 这道题也算是简单题,整个类除了构造函数以外就一个成员函数,测试用例

    2024年02月13日
    浏览(24)
  • 学C的第二十七天【指针的进阶(三)】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第二十六天【指针的进阶(二)】_高高的胖子的博客-CSDN博客  ================================

    2024年02月16日
    浏览(31)
  • 第二十七章 配置 Web Gateway 的默认参数 - 安全

    如果此处定义了用户名和密码,则所有系统管理员都必须提供此用户名和密码才能访问 Web Gateway 管理页面。 如果忘记密码,请使用以下步骤设置新密码: 编辑配置文件以指定新的用户名和密码值;在文件的 SYSTEM 部分进行更改。可以以明文形式指定密码的值。 重新启动网络

    2024年04月26日
    浏览(23)
  • 【正点原子FPGA连载】第二十七章 MDIO接口读写测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html 在以太网通信中,设备之间的物理层链路均由PHY芯片(物理层芯片,本文指YT8521)建立。PHY芯片有一个配置接

    2024年02月09日
    浏览(46)
  • vue 3 第二十七章:样式(动态class、动态style)

    在 Vue 中,我们可以使用动态绑定语法来动态地添加类名或样式。本章将介绍 Vue 3 中如何使用动态绑定语法来动态地添加类名或样式。 在 Vue 中,我们可以使用 :class 或 v-bind:class 指令来动态地添加类名。例如,下面的例子中,我们可以根据 isActive 的值动态地为元素添加 act

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包