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

内存函数的

时间:2024-09-16 20:22:07浏览次数:3  
标签:函数 int void char dest num sou 内存

1. memcpy使⽤和模拟实现

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

 模拟

 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函数处理的源内存块和⽬标内存块是可以重叠的。

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

• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。 

模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void* my_memove(void* dest, void* sou, size_t num)
{
	void* ret = dest;
	if (dest <= sou || ((char*)dest > (char*)sou + num))
	{
		while (num--)
		{
			*(char*)dest = *(char*)sou;
			dest = (char*)dest+1;
			sou = (char*)sou + 1;

		}
	}
	else
	{
		dest = (char*)dest + num - 1;
		sou = (char*)sou + num - 1;
		while (num--)
		{
			*(char*)dest = *(char*)sou;
			dest = (char*)dest - 1;
			sou = (char*)sou - 1;
		}
		return ret;
	}
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	my_memove(arr + 2, arr, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 

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

 

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

 

标签:函数,int,void,char,dest,num,sou,内存
From: https://blog.csdn.net/2402_86688931/article/details/142261521

相关文章

  • 字符函数和字符串函数
    1.字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是ctype.h2.字符转换函数C语⾔提供了2个字符转换函数: inttolower(intc);//将参数传进去的⼤写字⺟转⼩写inttoupper(......
  • 深层剖析函数递归的作用
    目录什么是递归递归的限制条件递归的举例递归与迭代扩展学习1.什么是递归1.1递归的含义在C语言中,递归就是函数自己调用自己。什么意思呢?接下来我将写一段代码展示例一:以上便是函数调用函数的例子,那么打印出来的值是多少呢?那么这个值为什么是27呢,就需要用到递......
  • 详解 Pandas 的透视表函数
    Pandas的透视表函数主要为pivot()和pivot_table(),主要的功能为对DataFrame的行和列进行重新组合来重塑数据。一、pivot函数pivot函数只能对数据进行重塑,不能进行聚合1.数据准备importpandasaspddf1=pd.DataFrame({'department_id':[1,2,3,3,......
  • Day20笔记-面向对象&类和对象&类中的属性和函数&构造和析构函数
    一、面向对象基础1.概念1.1面向对象的设计思想面向对象是基于万物皆对象这个哲学观点,在Python中,一切皆对象举例说明:​案例一:我想要吃大盘鸡​面向过程面向对象​1.自己去买菜1.委托一个会砍价的人帮忙去买菜​2.自己择菜2.委托一个临时工帮忙择菜​3.自己......
  • 范围 for,new 内存动态分配,nullptr
    范围for,new内存动态分配,nullptr范围forintmain(){intarr[]={11,12,13,14,15};for(autox:arr){//问题所在:需要将arr中的每一个都拷贝到x中去===>节省拷贝的方法:使用指针,提升效率cout<<x<<endl;}cout<<"============......
  • 函数栈帧的创建与销毁(简单易懂超详细~)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、什么是函数栈帧1.函数栈帧的创建与销毁2.寄存器3.函数调用创建函数栈帧二、main函数栈帧的创建与销毁1.main函数栈帧的开辟2.main函数中变量的创建3.main函数中Add的调用4.进入Add中去5.......
  • C语言main(主)函数介绍
    HelloWorldC语言main(主)函数介绍先展示一个标准的main程序#include<stdio.h>intmain(intargv,char*argc[]){return0;}这个程序是很多初学者学习C语言第一个程序,如果你现在将这个程序复制粘贴到文本编辑器并编译执行会发现,什么都没有!分编译器或IDE不同有的执行后会......
  • AUTOSAR -- SHE 内存槽更新
    AUTOSAR--SHE内存槽更新引言AUTOSAR(AUTomotiveOpenSystemARchitecture)是一个开放的、标准化的汽车软件架构,旨在为汽车电子系统提供一个统一的软件平台。在AUTOSAR中,安全硬件扩展(SecureHardwareExtension,SHE)是一个关键组件,用于保护汽车电子控制单元(ECU)中的敏感数据和代码。S......
  • 内存对齐和缓冲区溢出攻击
    一、问候语欢迎你来到我的博客!二、什么是内存对齐  计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定的规则......
  • ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)
    名词缩写ASID:AddressSpaceID地址空间标识符CD:ContextDescriptor;上下文描述符;CTP:Context-tablepointer上下文表指针EPT:ExtendedPageTable扩展页表GPA:GuestPhyicalAddress客人的实际地址GVA:GuestVirtualAddress访客虚拟地址HPA:HostPhyicalAddress......