C语言内存函数

C语言内存函数

针对内存块处理的

内存块=一块内存,就好像面包块=一块面包

模拟实现memcpy

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

• 这个函数在遇到 '\0' 的时候并不会停下来。

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

c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, void* str, size_t num)
{
	int i = 0;//遍历元素
	void* ret = dest;//目的地,记录初始位置
	assert(dest && str);
	while (num--)//复制num后面的数
	{
		*(char*)dest= *(char*)str;//强制类型转换
		dest= (char*)dest + 1;//注意++的写法
		str = (char*)str + 1;
	}
	return ret;
}
int main()
{
	char arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	char arr2[20] = { 0 };
	//将arr1中的3 4 5 6 7 拷贝放到arr2中
	my_memcpy(arr2, arr1+2, 17);
	return 0;
}

模拟实现memmove

memcpy也可以对重叠内存的部分进行拷贝

c 复制代码
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*)+1;
		}
	}
	else //从后到前拷贝
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
		return ret;
	}
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d", arr1[i]);
	}
	return 0;
}

memset函数的使用

memset的使用

c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "hello world";
	memset(arr+6,'x',5);
	printf("%s\n", arr);
	return 0;
}

运行结果

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

memcmp函数的使用

• ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节

• 返回值如下:

c 复制代码
int main()
{
//	//0000 0000 00000000 00000000 00000001
//	//0x00 00 00 01
	int arr1[] = { 1,2,3,4,5 };
//	//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
int arr2[] = { 1,2,3,6,5 };
//	//01 00 00 00 02 00 00 00 03 00 00 00 06 00 00 00 05 00 00 00
//
int ret = memcmp(arr1, arr2, 13);
//
printf("%d\n", ret);
	return 0;
}

00 02 00 00 00 03 00 00 00 06 00 00 00 05 00 00 00

//

int ret = memcmp(arr1, arr2, 13);

//

printf("%d\n", ret);

return 0;

}

复制代码
相关推荐
吃着火锅x唱着歌8 小时前
LeetCode 1446.连续字符
算法·leetcode·职场和发展
烦躁的大鼻嘎8 小时前
【Linux】深入Linux多线程架构与高性能编程
linux·运维·服务器·开发语言·c++·ubuntu
野生的编程萌新8 小时前
【C++深学日志】C++编程利器:缺省参数、函数重载、引用详解
c语言·开发语言·c++
愚润求学8 小时前
【贪心算法】day10
c++·算法·leetcode·贪心算法
Slaughter信仰8 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)
java·开发语言·jvm
吴秋霖8 小时前
主流反爬虫、反作弊防护与风控对抗手段
爬虫·算法·反爬虫技术
java1234_小锋8 小时前
Scikit-learn Python机器学习 - 分类算法 - K-近邻(KNN)算法
python·算法·机器学习
智者知已应修善业8 小时前
【矩阵找最大小所在位置】2022-11-13
c语言·c++·经验分享·笔记·算法·矩阵
shan&cen8 小时前
Day04 前缀和&差分 1109. 航班预订统计 、304. 二维区域和检索 - 矩阵不可变
java·数据结构·算法
手握风云-9 小时前
回溯剪枝的 “减法艺术”:化解超时危机的 “救命稻草”(二)
算法·机器学习·剪枝