C语言内存函数

1.memcpy使用和模拟实现

函数memcpy从source的位置开始向后复制num个字节的数据到destination指定的内存位置。

这个函数在遇到‘\0’的时候并不会停下来

如果source和destination有任何的重叠,复制的结果都是未定义的。

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\n", arr2[i]);
	}
	return 0;
}

多余的空间用0补齐

重叠的情况:

arr+2:首元素地址向后移动两个元素,3,4会被1,2覆盖

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

对于重叠的内存,交给memmove来处理

memcpy函数的模拟实现

memcpy函数拷贝结束之后,会返回目标空间的起始地址

void*的指针什么地址都能接收

void* memcpy(void* dst, const void* src, size_t count)
{
	void* ret = dst;//先将dst存起来
	assert(dst && src);
	while (count--)
	{
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;//对指针进行解引用,不同的指针每次加减的步长不同
		src = (char*)src + 1;//不能写成src++,dst++,也不能写成(char*)src++,强转为临时强转
		//void*不能直接解引用,要使src,dst向后访问一个字节,用char*类型的指针解引用
	}
	return(ret);//不能直接返回dst,他不是原来的地址了
}

2,memmove使用和模拟实现

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

如果原空间和目标空间出现重叠,就得使用memmove函数处理

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

该代码的意思:将1~5的数,拷贝到3~7的位置,会出现覆盖的情况,3,4会被1,2覆盖

问题的解决方法:1,可再搞一个数组,复制原来的数(1~10),再将(1~5)放到(3~7)的位置,再将得到的数拷贝放回去(有点浪费时间)

2,可以倒着放入数据

1,23,4,5,6,78.9.10

memmove的模拟实现

void* memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	if (dst <= src || (char*)dst >= ((char*)src + count))
	{
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;//对指针进行解引用,不同的指针每次加减的步长不同
			src = (char*)src + 1;//不能写成src++,dst++,也不能写成(char*)src++,强转为临时强转
		}
	}
	else
	{
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}

3,memset函数的使用

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

int main()
{
	char str[] = "hello world!";
	memset(str, 'x', 6);//6单位字节
	printf(str);
	return 0;
}

4.memcmp函数的使用

memcmp函数内存块的比较函数

任何系列都能比较

比较从buf1和buf2指针指向的位置开始,向后的count个字节

返回值

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值