12.C语言内存相关函数

一.memcpy使用和模拟实现

1.memcpy的使用

cpp 复制代码
#include <string.h>

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = {0};
	//将arr1中的1 2 3 4 5,拷贝到arr2中
	memcpy(arr2, arr1, 5*sizeof(int));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}

	return 0;
}
cpp 复制代码
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	//将arr1中的4 5 6 7 8,拷贝到arr2中
	memcpy(arr2, arr1+3, 5 * sizeof(int));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}

	return 0;
}
cpp 复制代码
int main()
{
	char arr1[10] = "he\0lo bit";
	char arr2[10] = { 0 };
	//将arr1中的4 5 6 7 8,拷贝到arr2中
	memcpy(arr2, arr1, 5);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%c ", arr2[i]);
	}

	return 0;
}

2.memcpy的模拟实现

cpp 复制代码
void* my_memcpy(void* dest, const void* src, size_t num)
{
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest+1;
		src = (char*)src + 1;
	}
}

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	//将arr1中的4 5 6 7 8,拷贝到arr2中
	my_memcpy(arr2, arr1+3, 5 * sizeof(int));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}

	return 0;
}
cpp 复制代码
void* my_memcpy(void* dest, const void* src, size_t num)
{
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest+1;
		src = (char*)src + 1;
	}
}

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

	return 0;
}
cpp 复制代码
void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

但是自己和自己进行拷贝的时候,会发生覆盖,结果并不对

二.memmove使用和模拟实现

1.memmove的使用

有重复的拷贝的情况,就使用我们的memmove

cpp 复制代码
#include <stdio.h>
#include <string.h>

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

2.memmove的模拟实现

cpp 复制代码
void* my_memmove(void* dest, const void*src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	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;
}

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

	return 0;
}

三.memset函数的使用

cpp 复制代码
//memset - 内存设置
int main()
{
	char arr[10] = "hello bit";
	memset(arr, 'x', 5);
	//memset 在设置的时候,是以字节为单位来设置的
	//
	printf("%s\n", arr);
	return 0;
}
cpp 复制代码
int main()
{
	int arr[10] = { 0 };
	memset(arr, 1, 40);

	return 0;
}

四.memcmp函数的使用

cpp 复制代码
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 1,2,3,4,8 };
	int ret = memcmp(arr1, arr2, 17);
	printf("%d\n", ret);

	return 0;
}
相关推荐
island13149 小时前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络
坚持就完事了10 小时前
Java中的集合
java·开发语言
魔芋红茶10 小时前
Python 项目版本控制
开发语言·python
云小逸10 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
冰暮流星10 小时前
javascript之二重循环练习
开发语言·javascript·数据库
风指引着方向10 小时前
自定义算子开发入门:基于 CANN op-plugin 的扩展实践
开发语言
dazzle10 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵10 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
Fairy要carry10 小时前
面试-GRPO强化学习
开发语言·人工智能
风指引着方向10 小时前
图编译优化全链路:CANN graph-engine 仓库技术拆解
c语言