首页 > 系统相关 >内存函数

内存函数

时间:2023-04-09 14:34:12浏览次数:52  
标签:函数 int void 数组 char 内存 arr1 拷贝

内存函数_内存函数

今日份学习“内存函数”

前言:

当我们了解字符串相关函数可以对一系列的字符串进行操作,但这些函数只针对于字符串操作且太局限性了,所以为了破开这个局限性,该篇文章将介绍的函数就能解决这个问题。

我们知道字符串相关的函数肯定是对字符串的每个字符进行操作控制的,每个字符且只占一个字节,所以每次操作访问都只针对一个字节的空间进行,就能对各个字符进行操作,但如果对其它类型的数据数组进行操作的话,就能不能达到我们想要的结果,例如说整型"Int"每个整型占四个字节的空间,若只能针对一个字节的空间进行操作的话,然而该空间的其它数据就不能被操作访问,所以就达不到我们想要的结果。

以下就是各个内存函数的介绍与应用

内存函数:

1.memcpy  拷贝函数

2.memmove  拷贝函数

3.memcmp  比较函数

4.memset  设置函数

一,memcpy 拷贝函数

功能:数据拷贝

格式:void * memcpy ( void * destination, const void * source, size_t num );

解析:memcpy函数为了能对各种各样的数据类型进行操作形参void * destination作为拷贝数据目的地址地利用void*空类型的方式接收各种实参,同样const void * source作为拷贝数据的源也利用void*空类型的方式接收实参,这里size_t num接收拷贝所有数据的字节数,则根据这个大小值来操作空间。

思路:①强制将void*都改成char*对地址空间操作②根据形参num的值决定操作空间的字节数,

注意:该函数不适用于相同地址的拷贝操作,确保目的地地址空间足够放下源空间的数据

运用方式:

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[]={1,2,3,4,5,6,7};//创建一个字符数组
  int arr2[20];//创建目的地空间的字符数组
  memcpy(arr2,arr1,sizeof(arr1));//将arr1数组作为源,将arr2数组作为目的地,把arr1整个数组大小传递
	for(int i=0;i<6;i++)//检验arr2数组的内容
  {
  	printf("%d ",arr2[i]);
  }
  return 0;
}

内存函数_内存函数_02成功拷贝

自主实现:

学会怎么用了,下面试着怎么造。

按照上面的思路

以数组的字节个数作为循环的核心。

#include<stdio.h>
void* my_memcpy(void* dst, const void* rst, size_t num)
{
	while (num--)//总字节个数作为循环条件
	{
		*(char*)dst = *(char*)rst;//一个字节一个字节拷贝
		((char*)dst)++;
		((char*)rst)++;
	}
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };//创建一个字符数组
	int arr2[20];//创建目的地空间的字符数组
	my_memcpy(arr2, arr1, sizeof(arr1));//将arr1数组作为源,将arr2数组作为目的地,把arr1整个数组大小传递
	for (int i = 0; i < 6; i++)//检验arr2数组的内容
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

内存函数_内存函数_03还是难不倒我们的。

这里提示几个容易写错的地方:

数据拷贝记得向强制类型转换后,再解引用进行赋值!!

  *(char*)dst = *(char*)rst;

注意代码的优先级,该加括号的要加上括号!!

 ((char*)dst)++;

 ((char*)rst)++;

二,memmove 内存移动函数(拷贝)

功能:数据拷贝

格式:void * memmove ( void * destination, const void * source, size_t num );

解析:该函数的实现功能与“memcpy“是一样样,但是该函数主要针对在同一个地址进行拷贝数据。

举个栗子:Int arr[10]={1,2,3,4,5,6,7};

我要将arr的前四个数”1,2,3,4“从arr的第三个数的位置依次进行拷贝,达到最终结果{1,2,1,2,3,4,7};

这就是同地址空间拷贝数据。

如果直接拷贝的话,则会造成数据丢失的情况:

{1,2,3,4,5,6,7}

标签:函数,int,void,数组,char,内存,arr1,拷贝
From: https://blog.51cto.com/u_15993084/6178869

相关文章

  • 一文弄懂Python中的sort和sorted函数
    1.引言Python中的sort()和sorted()函数主要用于按升序或降序对数据进行排序。在本文中比较用于列表时,两个函数在编程和语法上的差异。闲话少说,我们直接开始吧!2.Sort()函数基本用法用于列表排序的sort函数的语法如下:list.sort(reverse=False,key=None)用法如下:参数reverse:默认为......
  • 深度学习之PyTorch实战(5)——对CrossEntropyLoss损失函数的理解与学习
     其实这个笔记起源于一个报错,报错内容也很简单,希望传入一个三维的tensor,但是得到了一个四维。RuntimeError:onlybatchesofspatialtargetssupported(3Dtensors)butgottargetsofdimension:4查看代码报错点,是出现在pytorch计算交叉熵损失的代码。其实在......
  • C语言的回调函数原来这么简单
    手机端阅读:C语言的回调函数原来这么简单 了解开发语言的朋友应该都会对回调函数有所了解,在很多的程序开发语言中都能看到回调的身影。很多场景下,当某个条件成立以后我们希望代码执行某些指定的部分,这个时候可以考虑使用回调函数的方式,这样做思路更加的清晰,也能使代码结构的逻辑更加......
  • Android遇到内存泄漏和性能优化,需要采取以下措施
    内存泄漏:a.使用内存分析工具,如AndroidStudio的MemoryProfiler或LeakCanary,找出内存泄漏的位置,并修复代码。b.避免在Activity或Fragment中使用静态变量或单例模式,因为它们可能会持有对Activity或Fragment的引用,并导致内存泄漏。c.及时释放不再使用的资源,如关闭文件、释放......
  • C++逆向分析——构造函数和析构函数
    构造函数与析构函数构造函数structStudent{inta;intb; Student(){printf("Look.");} voidInit(inta,intb){this->a=a;this->b=b;} };如上代码中,我们发现了存在一个函数,这个函数没有返回类型并且与结构体名称一样,那这段函数在什么......
  • 龙龙自己写的 JS表格 生成函数
    functiongetTable(tr,td){varnum=1;document.write('<tableborder="1"width="600px">')//vartr=10;for(vari=1;i<=tr;i++){document.write('<tr>')//vartd=10for(varj=1;j<=td;j++){document.......
  • C++函数重载和对象
    函数的默认参数intfun(inta,intb=10,intc=20){returna+b+c;}intmain(){cout<<fun(10)<<endl;//当参数有值时也可以输出正确,如果程序员加了返回值就用程序员加入的值。}形参的数据从左到右当中间有参数后面也需要定义一个函数和声明只能实现一个;占位参数voidfun(int*a,int......
  • Rust编程语言入门之函数式语言特性:-迭代器和闭包
    函数式语言特性:-迭代器和闭包本章内容闭包(closures)迭代器(iterators)优化改善12章的实例项目讨论闭包和迭代器的运行时性能一、闭包(1)-使用闭包创建抽象行为什么是闭包(closure)闭包:可以捕获其所在环境的匿名函数。闭包:是匿名函数保存为变量、作为参数可在一个地方......
  • 关于gcc设置入口函数的讨论
    关于gcc设置入口函数的讨论一般的程序入口函数是_start(不是main,参考【2】)。如果我们想在main之前做点啥工作,或者希望链接一个项目的main.o对象,就需要另外指定入口函数。虽然gcc提供了指定入口函数的参数,但我发现往往不是我们想要的。gcc的指定入口函数参数gcc提供了两个命......
  • Qt-FFmpeg开发-回调函数读取数据(8)
    音视频/FFmpeg#QtQt-FFmpeg开发-使libavformat解复用器通过自定义AVIOContext读取回调访问媒体内容目录音视频/FFmpeg#QtQt-FFmpeg开发-使libavformat解复用器通过自定义AVIOContext读取回调访问媒体内容1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容......