网站设计电商首页,招牌做的好的网站有哪些,三亚最新政策,网页设计素材书身体扛不住的时候#xff0c;意志会带你杀出重围 文章目录
一、memcpy函数
函数介绍
模拟实现
二、memmove函数
函数介绍
模拟实现
三、memset函数
函数介绍
模拟实现 大家好#xff0c;我是纪宁。这篇文章给大家介绍C语言中常见的内存处理函数。
一、memcpy函数 … 身体扛不住的时候意志会带你杀出重围 文章目录
一、memcpy函数
函数介绍
模拟实现
二、memmove函数
函数介绍
模拟实现
三、memset函数
函数介绍
模拟实现 大家好我是纪宁。这篇文章给大家介绍C语言中常见的内存处理函数。
一、memcpy函数
函数介绍 memcpy是内存拷贝函数可以以字节为单位将一块内存的地址拷贝至另一块内存因为是以字节为单位进行拷贝所以任何数据类型都能拷贝但是memcpy函数的两块地址不能重叠一旦重叠可能会出现一些很难预料的结果。 memcpy函数的第一个参数是目标内存的首地址第二个参数是要拷贝内存的首地址第三个参数是需要拷贝的字节数因为拷贝源的内存空间里的内容不会改变所以加const修饰提高函数的安全性。
模拟实现 在模拟实现memcpy函数的时候只需要将对应位置的字节交换即可因为参数传过去的是空指针所以要先强制类型转化为char* 类型再进行解引用和赋值
#includeassert.h
char* my_memcpy(void* dest,const void* src, size_t num)
{assert(dest src);char* ret dest;while (num--){*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;}return ret;
}int main()
{int arr1[10] { 0,1,2,3,4,5,6,7,8,9 };int arr2[5] { 11,12,13,14,15 };char*stmy_memcpy(arr1, arr2, 20);int i 0;for (i 0; i 10; i){printf(%d , arr1[i]);}return 0;
} 在这段代码中arr1与arr2的内存是单独存在的他们的内存没有重叠可是当将arr1改为arr13时arr2改为arr1时预期结果应该是变为{0 1 2 0 1 2 3 4 8 9}可实际在操作的过程中却变成了{0 1 2 0 1 2 0 1 8 9}。这就是他们两块空间内存有重叠的原因。 为了解决这个问题我们大多数会使用另一个函数memmove。
二、memmove函数
函数介绍 memmove函数可以将一块内存的内存移动至另一块也类似于拷贝函数memcpy的功能但它相较于memcpy函数多了可以处理重叠内存空间的内存拷贝功能。 它的功能与理想中的拷贝内存空间的strcpy函数相同就不做过多赘述
模拟实现 通过简单的测试可以得到当目标内存的空间在源内存空间的后面时用上面实现strcpy函数的方法从初始位置一个一个拷贝是可以实现目的的如图 如果目标内存的空间在源内存空间的前面时不能达到理想的结果 所以对于目标内存的空间在源内存空间前面的情况我们可以从内存空间的后面往前拷贝、 总结 当目标空间位于源空间前面的时候要从后往前拷贝当目标空间位于源空间之前的时候要从前往后拷贝。在函数中用if...else语句来控制即可。
#includeassert.h
char* my_memmove(void* dest, const void* src, size_t num)
{assert(dest src);char* ret dest;if (src dest){while (num--){*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;}}elsewhile (num--){*((char*)dest num) *((char*)src num);}return ret;
}
int main()
{int arr1[10] { 0,1,2,3,4,5,6,7,8,9 };my_memmove(arr1, arr1 3, 20);int i 0;for (i 0; i 10; i){printf(%d , arr1[i]);}return 0;
}
三、memset函数
函数介绍 memset函数的作用是以字节为单位改数据。
void* my_memset(void* ptr, int value, int num)
{int i 0;for (i 0; i num; i){*((char*)ptri) value;}return (char*)ptr;
}
int main()
{int arr[10] { 0 };my_memset(arr, x, 39);printf(%s,(char*)arr);return 0;
} memest函数的第一个参数是被改数据的首地址第二个参数是要改成的内容整形家族第三个参数是要改的字节数。 虽然arr是整形数组但通过memset函数可以以字节为单位将它的每个字节的数据都改为字符型数据所以memset函数的第二个参数只要是整形家族即可。
模拟实现
void* my_memset(void* ptr, int value, int num)
{int i 0;for (i 0; i num; i){*((char*)ptri) value;}return (char*)ptr;
}
int main()
{int arr[10] { 0 };my_memset(arr, x, 39);printf(%s,(char*)arr);return 0;
} 博主写了好长时间如果你能给博主一个免费三连鼓励一下博主的话那么我觉得你的真是 泰 裤 辣