栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】内存操作函数的模拟和使用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言】内存操作函数的模拟和使用

大家好!我是铦。

内存操作函数头文件为 or

1、memcpy

原型为:void *memcpy( void *dest, const void *src, size_t count )

作用为:把src指向内容拷贝到src指向的内容中

使用格式:memcpy(目的地地址,源头地址,操作内存大小(字节))

我们试着模拟一下

#include"stdio.h"
#include"assert.h"

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

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

我们发现arr1中的前4*5个字节被拷贝到arr2中。(一个整型4字节)

*注意:

1、memcpy遇到''不会停下

因为memcpy根据根据操作内存大小来拷贝。

2、memcpy不能拷贝重叠内存

如果代码如下,则结果却不是我们想要的。这是因为memcpy在拷贝过程中将arr1[0]拷贝到arr1[2]处后再想把arr1[2]中的3拷贝到arr1[4]中时发现arr1[2]已经被改为1了。

2、memmove

原型为:void *memmove( void *dest, const void *src, size_t count )

作用为:内存拷贝(可拷贝重叠内存)

使用格式:memmove(目的地地址,源头地址,操作内存大小(字节))

个人认为是memcpy的升级版哈哈

我们试着模拟一下

#include"stdio.h"
#include"assert.h"

void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		//从前往后拷贝
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//从后往前拷贝
		while (count--)
		{
			*((char*)dest + count) = *((char*)src + count);
		}
	}
	return ret;
}

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

 

结果如上图,我们发现 memcpy实现不了的拷贝重叠内存,memmove可以实现。

3、memcmp

原型为:int memcmp( const void *buf1, const void *buf2, size_t count );

作用为:内存比较

使用格式:memcpy(地址1,地址2,比较的内存大小 (字节))

我们试着使用用一下

#include"stdio.h"
#include"string.h"

int main()
{
	char buffer1[] = "abcde";
	char buffer2[] = "abce";
	int ret = memcmp(buffer1, buffer2, 4);
	printf("%d", ret);
	return 0;
}

 

返回值:

当两个参数进行逐字节比较时,如果遇到的第一对不同内存时,若参数1中的数据大于参数2中的数据,则返回大于0的数,反之返回小于0的数,若在比较字节内全部相同返回0。

 

4、memset

原型为:void *memset( void *dest, int c, size_t count )

作用为:内存设置

使用格式:memset(目的地地址,想改成的数字,设置多少字节)

我们试着使用用一下就能知道作用了

 谢谢大家观看,写得不好还请指出!

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/783896.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号