首页 > 系统相关 >C语言内存函数

C语言内存函数

时间:2024-11-22 20:19:02浏览次数:3  
标签:src 函数 memmove int void C语言 char 内存 dst

目录

1.mencpy使用和模拟实现

2.memmove使用和模拟实现

3.memset函数的使用

4.memcmp函数的使用

5.小结


1.mencpy使用和模拟实现

void * memcpy ( void * destination, const void * source, size_t num );
  •  函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
  • 这个函数在遇到 ‘ \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;
}

对于重叠的内存,交给memmove来处理 。

memcpy函数的模拟实现:

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;
 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 ", arr1[i]);
 }
return 0;
}

 输出的结果:

1 2 1 2 3 4 5 8 9 10

memmove的模拟实现:

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是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] = "hello world";
 memset (str,'x',6);
 printf(str);
 return 0;
}

输出的结果:

xxxxxxworld

4.memcmp函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
  • 比较ptr1和ptr2指针指向的位置开始的,向后的num个字节。
  • 返回值如下:

 

#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;
}

5.小结

这一小节我们主要讲解了C语言主要使用的内存函数,如果大家喜欢这篇博客,还请点点赞,这样博主更有动力更新下去喔。 

标签:src,函数,memmove,int,void,C语言,char,内存,dst
From: https://blog.csdn.net/2401_87194328/article/details/143894224

相关文章

  • SG函数
    有向图游戏题意:给定一个有向无环图,图中只有一个起点,在起点上放一个棋子,两个玩家轮流沿着有向边推动棋子,每次走一步,不能走的玩家失败先分析一下对于这样一个游戏,最终结束状态是棋子走到一个没有出度的点,这种状态属于必输状态,结合前两篇的Nim游戏可以知道,所有连向这个必输状态......
  • 【C++】绘制内存管理的地图
    生活是属于每个人自己的感受,不属于任何人的看法。前言 这是我自己学习C++的第二篇博客总结。后期我会继续把C++学习笔记开源至博客上。 上一期笔记是关于C++的类与对象础知识,没看的同学可以过去看看: 【C++】面向对象编程的艺术之旅-CSDN博客https://blog.csdn.net/......
  • 字符函数和字符串函数
    字符函数例子 字符转换函数 strlen的实现和模拟  strcpy的使用和模拟         strcat的使用和模拟 strcmp的模拟和实现  ......
  • 构造方法内存图流程分析
    1.内存图分析https://kdocs.cn/l/cuQvFYJirzaR?linkname=150996228省略了方法区。主方法进栈,创建stu变量,有new进堆,开辟空间,设计图有什么,空间就有什么,nameage全部写上,均为默认值,并且this也在里面走完上一步并不会直接把地址给stu,而是还要接着执行后半段,调用带有形参的构造方法......
  • 零基础同时入门并掌握C语言和C++——第一节——选择开发环境
    本系列文章将针对C语言使用VisualStudio2022, C++使用DevC++作为开发环境进行讲解。下面分别讲述选择这两款开发环境的原因和好处:DevC++市面上有很多版本,常见的有蓝色(也就是图片中展示的这款)红色,和小熊猫等。对于初学者来说可能会纠结究竟下载哪款才正确和会不会下载到盗版......
  • C语言 结构体,共同体,枚举
    结构体语法:1>struct结构体名称{    数据类型 变量名1;    数据类型 变量名2;    ...};     2>struct 结构体名称{    数据类型 变量名1;    数据类型 变量名2;    ...}结构体变量名;  ......
  • C语言字符串处理相关函数
    作用:处理字符串,如计算字符串长度,查找字符串中指定的字符或字符串,切割字符串等头文件:string.h相关函数:strlen作用:测量字符串长度语法:size_tstrlen(constchar*s);    参数:s:要测量的字符串的首地址    返回值:测量的字符串串长度注意:不包含......
  • glibc 内存分配与释放机制详解
    本文以一次线上故障为基础介绍了使用glibc进行内存管理可能碰到问题,进而对库中内存分配与释放机制进行分析,最后提供了相应问题的解决方案。一、引言内存对象的分配与释放一直是后端开发人员代码设计中需要考虑的问题,考虑不周极易造成内存泄漏、内存访问越界等问题。在发生......
  • JVM 性能调优 -- 线上应用 JVM 内存调优【实战】
    前言:上一篇我们分享了线上应用的JVM内存预估技巧,通过对JVM内存的预估来合理的选用服务器资源和应用部署方案,本篇我们来分享引用的JVM调优实例,如何通过JVM调优来降低应用的GC频率。JVM系列文章传送门初识JVM(Java虚拟机)深入理解JVM(Java虚拟机)一文搞懂JVM......
  • 编程之路,从0开始:动态内存笔试题分析
        Hello大家好,很高兴我们又见面啦!    给生活添点passion,开始今天的编程之路。今天我们来看几个经典的动态内存笔试题。1、题目1#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>voidGetMemory(char*p){ p=(char*)malloc(100......