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

C语言-内存函数

时间:2024-03-25 23:00:49浏览次数:19  
标签:src 函数 int void C语言 dest num 内存 memcpy

文章目录

1.memcpy

1.1.memcpy语法形式

void* memcpy(void* destinotion,const* 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[20];
	memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

1.2.memcpy的模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
	int i = 0;
	void* ret = dest;
	assert(dest && src);
	for (i = 0; i < num; i++)
	{
		*(char*)dest = *(char*)src;
		src = (char*)src + 1;
		dest = (char*)dest + 1;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

2.memmove

2.1.memmove的语法形式

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

和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr + 2, arr, 5 * sizeof(int));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

2.2.memmove的模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	if (dest < src)
	{
		while (num--)
		{
			*(char*) dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while(num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 5 * sizeof(int));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

3.memset

3.1.memset的语法形式

void * memset ( void * ptr, int value, size_t num )

memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。

int main()
{
	char arr[] = { "hello world" };
	memset(arr, 'x', 5);
	printf("%s",arr);
	return 0;
}

输出结果:

xxxxx world

4.memcmp

4.1.memcmp的语法形式

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节er

int main()
{
	int arr1[] = { 1,2};
	int arr2[] = { 1,3 };
	int ret = memcmp(arr1, arr2, 8);
	printf("%d ", ret);
	return 0;
}

输出结果:

-1

标签:src,函数,int,void,C语言,dest,num,内存,memcpy
From: https://blog.csdn.net/2302_77203854/article/details/136996547

相关文章

  • 函数‘select’标签‘"data.frame"’找不到继承方法
     001、R语言中出现如下报错>a<-1:5>b<-letters[1:5]>test<-data.frame(a,b)>library(dplyr)>select(test,a)Errorin(function(classes,fdef,mtable):函数‘select’标签‘"data.frame"’找不到继承方法##此处报错 002、原因分......
  • 【笔记】普通生成函数
    【笔记】普通生成函数0前置芝士0.1等比数列因为我不会,所以在这里提一嘴。\(a_i=a_{i-1}q\Rightarrowa_i=a_1q^{i-1}\)\(S=\sum\limits_{i=1}^na_i\RightarrowqS=\sum\limits_{i=2}^{n+1}a_i=S-a_{n+1}+a_1\)\(\RightarrowS=\dfrac{a_1(q^n-1)}{q-1}\)​0.2泰勒级......
  • 三角函数
    前置弧度制。具体地,\(2\pi=360^\circ\)神秘东西\(\sin(\alpha)+\cos(\alpha)\)\[\begin{aligned}&\cos(\alpha)+\sin(\alpha)\\=&\sqrt{2}\cos(\alpha-\frac{\pi}{4})=&\sqrt{2}\sin(\alpha+\frac{\pi}{4})\end{aligne......
  • 1.C语言有关的小学习
    据说据说编程的基础就是c反正大学的课程上来就这样安排的之前一直用着(狗屁)Visualstudio2022一堆麻烦还贼占内存之前一直被sdk困惑就是下载完之后还识别不了懒得找各种了那就找找找终于找到Clion了https://blog.csdn.net/weixin_46211269/article/details/119940030......
  • c语言编程题目:水仙花数
    题目:水仙花数是指一个N位正整数(N>=3),它的每位上的数字的N次幂之和等于它本身。例如:153=1^3+5^3+3^3。要求:计算所有N位水仙花数。给出一个正整数N(3<=N<=7),按递增顺序输出所有水仙花数,每个数字占一行。编程思路分析:输入一个正整数N。N为位数,N=3就表明是3位数。判断N位......
  • 03-python函数和列表
    函数定义def函数名():执行内容#当函数需要返回值时,return,没有返回值默认返回NonereturnxxxNone的使用场景函数返回值上if判断中,None为False定义变量时,用作变量声明,暂时变量不需要具体值global关键字(提升局部变量为全局变量)nn=100defhello():......
  • C语言:自定义数据类型——结构体
    文章目录结构体类型的声明结构体的声明结构体变量的创建和初始化结构的特殊声明结构体的自引用结构体内存对齐对齐规则修改默认对齐数结构体传参结构体类型的声明结构体的声明structtag{ member-list;//成员}variable-list;//变量名例如描述一个学生str......
  • C++动态内存管理
    目录C/C++内存分配C++内存管理C++内存管理介绍C++内存管理使用C++内存管理基本语法operatornew和operatordelete函数定位new表达式(placement-new)基本语法使用场景malloc/free和new/delete相同点不同点C/C++内存分配在C语言动态内存管理章节已经了解到内......
  • Java的方法、重载、递归、内存
    一、方法什么是方法方法:一堆代码的集合,一般完成了某个特定的功能,当我们再次使用这个方法的时候,就等于使用了这些代码。方法目的:代码复用,提高程序灵活度,易维护,易扩展。方法的声明修饰符列表  返回值类型  方法名 (参数列表){ 方法体 }注意事项修饰符列表 ......
  • C语言例4-1:计算半径为1.5的圆的周长和面积并输出
    代码如下://计算半径为1.5的圆的周长和面积并输出#include<stdio.h>#definePI3.1415926intmain(void){ floatradius,length,area; radius=1.5; length=2*PI*radius;//计算圆的周长 area=PI*radius*radius;//计算圆的面积 printf("radiu......