【C语言】内存函数

文章目录

  • 前言
  • 一、memcpy使用和模拟实现
    • memcpy使用
    • memcpy模拟实现
  • 二、memmove 使用和模拟实现
    • memmove的使用
    • memmove的模拟实现
  • 三、memset 函数的使用
  • 四、memcmp 函数的使用
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:
内存,就像计算机的大脑,对于程序而言至关重要。而内存函数,就是程序员的“魔法工具”,让我们能够更灵活地处理数据。

这篇博客将揭开内存函数的神秘面纱,从简单的分配和释放内存,到复杂的拷贝和比较操作。我们将用通俗易懂的语言,探讨这些函数是如何帮助我们更好地编写程序的。

通过深入了解这些内存函数,我们不仅可以提高代码的效率,还能避免让程序“头疼”的内存错误。让我们一同踏入内存函数的世界,让编程变得更简单、更有趣。


提示:以下是本篇文章正文内容,下面案例可供参考

注意:> 查询函数如何使用可以通过这个网站

一、memcpy使用和模拟实现

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

- 函数memory从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
- 这个函数在遇到'\0'的时候并不会停下来。
- 如果source和destination所指向的内存空间有任何的重叠,复制的结果都是未定义的

memcpy使用

#include 
#include 
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[5] = { 0 };
	memcpy(arr2, arr1, 8);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

运行结果
在这里插入图片描述

memcpy模拟实现

//memcpy的模拟实现
#include 
#include 
void* my_memcpy(void* dest, const void* source, size_t num)
{
	void* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)source;
		((char*)dest)++;
		((char*)source)++;
	}
	return ret;
}

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[5] = { 0 };
	my_memcpy(arr2, arr1, 8);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

运行结果和之前一致

二、memmove 使用和模拟实现

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

memmove的使用

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

//memmove的使用
#include 
#include 
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[5] = { 0 };
	memmove(arr1+2, arr1, 12);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

运行结果
【C语言】内存函数_第1张图片

memmove的模拟实现

//memmove的使用
#include 
#include 
//考虑两种情况,一种是src在dest后面这时候拷贝时候源数据不会覆盖,第二种情况则需要倒序拷贝
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	if (dest <= src || (char*)dest >= ((char*)src + num))
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			((char*)dest)++;
			((char*)src)++;
		}
		return ret;
	}
	else
	{
		(char*)dest += num-1;
		(char*)src += num-1;
		while (num--)
		{
			*(char*)dest = *(char*)src;
			((char*)dest)--;
			((char*)src)--;
		}
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	my_memmove(arr1+2, arr1, 12);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

运行结果
【C语言】内存函数_第2张图片

三、memset 函数的使用

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

memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
使用:
【C语言】内存函数_第3张图片

四、memcmp 函数的使用

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

  • 从ptr1和ptr2指针指向的位置开始比较向后的的num个字节内容
  • 返回值和strcmp类似,具体可以在文章开头提到的网站去查询

【C语言】内存函数_第4张图片
代码实现
【C语言】内存函数_第5张图片

总结

内存函数简要总结:memcpy、memmove、memset和memcmp

  1. memcpy函数:

    • 功能: 将源内存区域内容复制到目标内存区域。
    • 特点: 快速,但源和目标内存区域不能重叠。
    • 用法: memcpy(destination, source, size);
  2. memmove函数:

    • 功能: 与memcpy类似,处理重叠的内存区域复制。
    • 特点: 灵活,适用于处理重叠情况。
    • 用法: memmove(destination, source, size);
  3. memset函数:

    • 功能: 将内存区域内容设置为特定值。
    • 特点: 快速,常用于初始化数组或清空内存。
    • 用法: memset(destination, value, size);
  4. memcmp函数:

    • 功能: 比较两个内存区域的内容。
    • 特点: 返回0表示相等,正值和负值表示不同。
    • 用法: memcmp (memory1, memory2, size);

这些内存函数是C语言中常用的工具,用于实现内存的复制、移动、初始化和比较。选择适当的函数取决于具体的需求,但要确保处理重叠的情况以保障程序的正确性和性能。

你可能感兴趣的:(c语言,c语言,c++,算法,数据结构,后端,开发语言)