C语言中的内存函数

相比于内存函数,字符串函数和字符函数是对字符串和字符进行操作,内存函数是对内存进行操的。下面跟大家分享我学到的几个内存函数。

memcpy函数

void* memcpy(void* dest, const void* sour, size_t num);
dest是目标地址,sour要拷贝的源地址,num是要拷贝的字节数
因为内存函数是对内存进行操作,如果对内存进行操作就不用受制于数据的类型,所以这里使用void类型的指针因为void可以接受任何类型的指针便于操作。

memcpy函数的作用是从source的位置开始向后复制num个字节的数据到dest指向的内存位置,当遇到\0的时候停下来,如果source和dest在内存中的地址有重叠,复制的结果是未知的。

memcpy函数的使用

int main()
{
	int arr1[100] = { 0 };
	int arr2[100] = { 1,2,3,4,5 };
	memcpy(arr1, arr2, 20);//一个int类型是4个字节
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);//输出结果为1 2 3 4 5
	}
	return 0;
}

memcpy函数的模拟

void* my_memcpy(void* dest, const void* sour, size_t num)
{
	char* ret = dest;//首先存一下dest的首地址,
    //这里为了提高模拟度因为在库函数里memcpy函数返回值就是目标函数的首地址
	assert(dest != NULL);
	assert(dest != NULL);
	int count = num;
	//因为是对内存进行操作所以需要一个字节一个字节的交换
	while (count--)
	{
		*((char*)dest) = *((char*)sour);
		(char*)dest = ((char*)dest) + 1;
		(char*)sour = ((char*)sour) + 1;
	}
	return ret;
}

memmove函数

void * memmove ( void * dest, const void * sour, size_t num );
函数参数中的dest,sour,num于memcpy函数的参数相同

memmove函数就是用来复制出现内存重叠的情况。

memmove函数的使用

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr, arr + 2, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
这里就出现了内存重叠的情况将 3 4 5 6 7 放到1 2 3 4 5 的位置上
其中替换的部分 3 4 5 是的内存是重叠的memmove就是用来处理这种情况

memmove函数的模拟 

memmove函数的模拟相对于memcpy函数的模拟来说相对麻烦一些,分为一下三种情况下面我们来一个一个分析。

 第一种情况

第二种情况 

第三种情况 

代码部分

void* my_memmove(void* dest, const void* sour, size_t num)
{
	void* ret = dest;//记录目标位置的首地址
	//首先防止传进来的指针不为空
	assert(dest != NULL);
	assert(sour != NULL);
	//通过分析三种情况我们会发现如果dest指针小于sour指针就从前往后换,
	//如果dest指针大于sour就需要从后往前换
	//如果dest的指针大于sour+num从后往前或者从前往后都一样
	//判断dest和sour
	if (dest > sour)
	{
		while (num--)
		{
			*(((char*)dest) + num) = *(((char*)sour) + num);
		}
	}
	else if(dest <= sour || (char*)dest >= (char*)sour + num)
	{
		while (num--)
		{
			*((char*)dest) = *((char*)sour);
			(char*)dest = ((char*)dest) + 1;
			(char*)sour = ((char*)sour) + 1;
		}
	}
	return ret;//返回目标首地址
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr, arr + 2, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

memset函数

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

void * memset ( void * ptr, int value, size_t num );
ptr要修改内存位置的首地址,value要修改成的内容,num要修改的字节数

memset函数的使用

int main()
{
	char prt[] = "Hello Word";
	memset(prt, 'x', 5);
	printf("%s", prt);//输出结果为:xxxxx Word
	return 0;
}

memcmp函数

memcmp函数用来比较从prt1和prt2指针指向的位置开始,往后m个字节的内容进行比较,如果prt1大于prt2就返回一个非零的值,反之小于就返回小于零的值,如果等于就返回零。

memcmp函数的使用

int main()
{
	char buf1[] = "asdfg";
	char buf2[] = "asdfi";
	int i = memcmp(buf1, buf2, 5);
	printf("%d\n", i);
	if (i == 0)
	{
		printf("buf1=buf2\n");
	}
	else if (i>0)
	{
		printf("buf1>buf2\n");
	}
	else if (i<0)
	{
		printf("buf1<buf2\n");
	}
	return 0;
}

这些就是我所学到的C语言重的内存函数,请大佬们多多指错,感谢!

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程菜鸟99号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值