C语言内存函数

目录

一.memcpy使用和模拟实现

二.memmove使用和模拟实现

三.memset函数的使用

四.memcmp函数的使用


前言

内存函数是一组用于操作内存的函数,它们通过访问内存地址来操作对象。这些函数可以用于复制、移动、比较和设置内存中的数据。内存函数可以应用于任何类型的对象不需要关心对象的具体类型

此外,内存函数在遇到空字符(‘\0’)不会停止复制

一.memcpy使用和模拟实现

C语言内存函数_第1张图片

1.使用

函数memcpysource的位置开始向后复制num字节的数据到destination指向的内存位置--内存 的拷贝

如果source和destination有任何的重叠复制的结果都是未定义的----这里对于重叠的就需要用到memmove函数来处理

需要注意的是在vs2022里,memcpy函数能够对重叠的部分进行使用,功能涵盖memmove函数.

我们可以对destination进行修改 从而实现arr2+3下标为3开始拷贝

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

2.模拟实现

这里使用void*接收返回值,这样可以接收任何类型的 

强制类型转化为char*,依次向后1个字节拷贝(+1)

C语言内存函数_第2张图片

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return (ret);
}

二.memmove使用和模拟实现

C语言内存函数_第3张图片

1.使用

memcpy差别就是memmove函数处理的源内存块和目标内存块是可以重叠的

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

2.模拟实现

这里根据dest和src的位置分为,dest<=src从前往后排;dest>src以及未重叠部分从后往前排

dest<=src的情况即上述memcpy函数实现

第二种情况dest>src以及未重叠部分

这里我们从后往前排,可以避免因为重叠导致的数字消失

1 1 1 1 1//错误的结果——从前往排的情况下

1 1 2 3 4//正确的结果——从后往前排

void* my_memmove(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	//从前往后
	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);
		}
	}
	return (ret);
}

三.memset函数的使用

C语言内存函数_第4张图片

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

int main()
{
	char str[] = "hello world";
	memset(str, 'x', 6);
	printf(str);
	return 0;
}

xxxxxxworld//输出结果

四.memcmp函数的使用

C语言内存函数_第5张图片

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

返回值如下

C语言内存函数_第6张图片

int main()
{
	char buffer1[] = "DWga";
	char buffer2[] = "DwGa";
	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;
}

'DWga' is less than 'DwGa'.//输出结果

 对于c语言中内存函数就讲到这里,如果对你有用的话,希望能三连鼓励下,谢谢

你可能感兴趣的:(C语言初阶,c语言,开发语言,vscode,经验分享,c++)