• 内存操作函数(c语言)


    一、memcpy(内存拷贝)

    和strcpy比较呢? memcpy什么类型都能够拷贝,而strcpy只是对字符串的

    void * memcpy ( void * destination, const void * source, size_t num )
    
    • 1

    在这里插入图片描述

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

    二、模拟实现memcpy

    如何去模拟实现这个内存拷贝(memcpy)??
    **注意针对所有的类型!**所以传的是 void
    注意大小端问题!
    注意编译器识别字节问题!

    在这里插入图片描述

    void* my_memcpy(void* dest, void* src, size_t num)
    {
    	void* ret = dest;
    	assert(dest);//断言
    	assert(src);
    	while(num--)//num是字节数
    	{
    		*(char*)dest = *(char*)src;//为什么三句不能化如下代码:
    		dest = (char*)dest + 1;//不写成(*(char*)dest)++ = (*(char*)src)++
    		src = (char*)src + 1;//原因是有的编译器是通不过的
    	}
    	return ret;
    }
    int main()
    {
    	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    	int arr2[10] = { 0 };
    	my_memcpy(arr2, arr1, 20);
    	for (int i = 0; i < 20 / (sizeof(arr1[0])); i++)
    	{
    		printf("%d ", arr2[i]);
    	}
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    三、memmove

    和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
    如果源空间和目标空间出现重叠,就得使用memmove函数处理。

    void * memmove ( void * destination, const void * source, size_t num );
    
    • 1
    int main()
    {
    	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    	int arr2[10] = { 0 };
    	memmove(arr2, arr1+2, 20);
    	for (int i = 0; i < 20 / (sizeof(arr1[0])); i++)
    	{
    		printf("%d ", arr2[i]);//结果是 3,4,5,6,7
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    如何模拟实现?
    在这里插入图片描述
    在这里插入图片描述

    #include
    void* my_memmove(void* dest, void* src, size_t num)
    {
    	void* ret = dest;
    	assert(dest);
    	assert(src);
    
    	if (dest < src)//1 前->后
    	{
    		while(num--)
    		{
    			*(char*)dest = *(char*)src;
    			dest = (char*)dest + 1;
    			src = (char*)src + 1;
    		}
    	}
    	else //2 3 后->前
    	{
    		while (num--)
    		{
    			*((char*)dest + num) = *((char*)src + num);
    		}
    	}
    	return ret;
    }
    int main()
    {
    	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    	int arr2[10] = { 0 };
    	my_memmove(arr2, arr1+2, 20);
    	for (int i = 0; i < 20 / (sizeof(arr1[0])); i++)
    	{
    		printf("%d ", arr2[i]);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    四、两者关系?

    momcpy是实现不重叠的拷贝就可以了
    mommove是需要重叠内存的拷贝的
    mommove的功能是包含momcpy的。
    在这里插入图片描述

    五、memcmp

    比较从ptr1和ptr2指针开始的num个字节

    int memcmp ( const void * ptr1,  const void * ptr2, size_t num );
    
    • 1
    int main()
    {
    	int arr1[] = { 1,2,3,0,5 };//01 00 00 00 02 00 00 00 03 00 00 00 00 00 00 00 ..
    	int arr2[] = { 1,2,3,4,0 };//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 ..
    	int ret = memcmp(arr1, arr2, 13);// 第13位:04>01 返回是大于0的数
    	printf("%d\n", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    六、memset(内存设置)

    void *memset(void *ptr,int value,size_t num);
    
    • 1
    int main()
    {
    	int arr[] = { 1,2,3,4,5 };
    	memset(arr, 0, 8);
    	int i = 0;
    	for (i = 0; i < 5; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    将前8个字节的数改成0,图1是原始数据,图2是改变后的内存数据

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    【矩阵论】正规方程——生成子空间
    [附源码]Python计算机毕业设计Django高校流浪动物领养网站
    【无标题】
    华云数据张华林:投身数字蓝海 绘就云上强国
    ros-python学习样例笔记
    十分钟掌握uml符号!把类图画给面试官看!
    win10&11安装MG-SOFT+MIB+Browser+v10b
    【JS 逆向百例】某网站加速乐 Cookie 混淆逆向详解
    拓展2: Python Requests库的使用
    【广州华锐互动】煤矿坍塌VR事故警示教育突破了哪些限制?
  • 原文地址:https://blog.csdn.net/qq_40599849/article/details/126839649