c语言内存函数

memcpy的使用和模拟实现

void * memcpy ( void * destination, const void * source, size_t num );
从函数的参数来看,memcpy函数是从source的位置开始向后复制num个字节的数据(注意是num个字节)到destination指向的内存位置,是从内存直接操作的,如果是进行字符串的复制时,我们都知道,字符串的结束标志是’\0’ 但memcpy函数遇到’\0’并不会停止,这一点也需要注意。

下面我们具体实现一下

#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}

return 0;
}

在这里插入图片描述

可以看出,当我们复制20个字节时(也就是五个整型元素),arr2数组前五个都被赋值了,而之后的元素依然是初始化的0.

接下来我们看一下字符的例子:
在这里插入图片描述
可以看出,'\0’也被复制了下来

接下来我们简单模拟一下memcpy函数:

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

memmove的使⽤和模拟实现

void * memmove ( void * destination, const void * source, size_t num );
我们发现memmove和memcpy的参数一样,其实使用方法也是一样的,二者最大的区别就是,memmove可以处理的源内存块和⽬标内存块是可以重叠的,我们下面举个例子就好理解了。

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

在这里插入图片描述
其实也就是自己复制自己,然后自己修改自己。

接下来我们看模拟实现:

void* my_memove(void* dest, const void* src, size_t num) {
	assert(dest && src);
	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的使用

void * memset ( void * ptr, int value, size_t num );
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容,一般情况下,我们常用与将数组值全部设为0或-1,其他值并不常设置。这个函数在之前简单提过怎么使用的,链接: 可以看上一篇博文

这次我们看下设置字符的例子:

#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "hello world";
memset (str,'x',6);
printf(str);
return 0;
}

在这里插入图片描述

memcmp的使用

这是一个内存比较的函数
memcmp函数返回一个整数值,表示比较结果:
如果两个内存区域的前n个字节完全相同,则返回0。
如果从第一个字节开始比较,s1指向的内存区域小于(大于)s2指向的内存区域,则返回一个小于(大于)零的值。
具体来说,memcmp首先将s1指向的内存区域的第一个字节的值减去s2指向的内存区域的第一个字节的值,若差值为0,则继续比较下一个字节,直到比较完n个字节或遇到不相等的字节为止。

因此,memcmp不仅可以用于比较字符串,还可以用于比较任意类型的内存区域,只要这些内存区域的内容是可以按字节进行比较的。

#include <stdio.h>  
#include <string.h>  
int main() {
	char str1[] = "Hello, World!";
	char str2[] = "Hello, Universe!";
	size_t n = 5; // 我们将比较前5个字节  
	int result = memcmp(str1, str2, n);
	if (result == 0) {
		printf("str1和str2的前%zu个字节相同。\n", n);
	}
	else if (result < 0) {
		printf("str1的前%zu个字节小于str2的对应字节。\n", n);
	}
	else {
		printf("str1的前%zu个字节大于str2的对应字节。\n", n);
	}
	return 0;
}

在这里插入图片描述

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值