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;
}
相关推荐
端平入洛5 小时前
delete又未完全delete
c++
颜酱6 小时前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub10 小时前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
祈安_10 小时前
C语言内存函数
c语言·后端
NAGNIP21 小时前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP21 小时前
一文搞懂激活函数!
算法·面试