我是靠谱客的博主 紧张香水,最近开发中收集的这篇文章主要介绍C语言内存函数详解&模拟实现(memcpy、memmove、memcmp、memset)内存函数总结,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 内存函数
- 一、memcpy 内存拷贝
- 二、memmove 内存重叠拷贝
- 三、memcmp 内存比较
- 四、memset 内存设置
- 总结
内存函数
注:使用内存函数需包含头文件<string.h>
本文主要介绍四种内存函数,分别为memcpy内存拷贝函数、memmove内存重叠拷贝函数、memcmp内存比较函数以及memset内存设置函数。
一、memcpy 内存拷贝
1.函数参数:
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 第一个参数是要将拷贝的内容存放的地址, 第二个参数是拷贝内容的地址,第三个参数是拷贝的字节个数
- 应该用于拷贝不重叠的内存。
- 遇到 ‘ ’ 的时候不会停下来,只会拷贝 num 个后结束。
- 以字节为单位。
- 如果source和destination有任何重叠,复制的结果都是未定义的。
- 无法对自己内部数据处理 因为会改变位置 负责拷贝两块独立空间中的数据
重叠内存的拷贝用memmove。
2.使用方式:
例:从arr拷贝5个元素到arr1中
#include <stdio.h>
#include <string.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
}
运行结果:
3.模拟实现:
- 函数的参数和放回参数设置成 void* 类型
- 因为函数以字节为单位拷贝,要强制转换成 char* 类型
void* my_memcpy(void* dest,const void* src,size_t num)
{
assert(dest && src);
void* ret = dest; //记录位置
while (num--)
{
//dest和src是void*类型,不能直接解引用,先强转成char*型(因为可能长度不是4整数,不能int*)
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[10] = { 0 };
}
二、memmove 内存重叠拷贝
1.函数参数:
void * memmove ( void * destination, const void * source, size_t n)
- 参数上,和memcpy 完全一样,不过memcpy 无法处理重叠情况
memcmp 用来处理果源空间和目标空间重叠的情况。
2.使用方式:
#include<string.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr+2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
3.模拟实现:
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* str, size_t num)
{
void* s = dest;
assert(dest && str);
if (dest < str)
{
while (num--)
{
//前 -> 后
*(char*)dest = *(char*)str;
dest = (char*)dest + 1;
str = (char*)str + 1;
}
}
else
{
//后 -> 前
while (num--)
{
*((char*)dest + num) = *((char*)str + num);
}
}
return s;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
三、memcmp 内存比较
1.函数参数:
int memcmp ( const void * ptr1, const void * ptr1, size_t num );
- memcmp 和 strcmp 类似,都是比较函数,结果返回值也一样。不过memcmp比较的是内存。
使用的方法与strcmp类似。
2.使用方式:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int str[10] = { 1,2,3,2,2,9,8,9 };
int ret = memcmp(arr, str, 20);
if (ret > 0)
printf("arr > strn");
else if (ret < 0)
printf("arr1 < strn");
else
printf("arr1 == strn");
return 0;
}
3.模拟实现:
int my_memcmp(const void* ptr, const void* ptr2,size_t num)
{
while (num--)
{
if (*(char*)ptr < *(char*)ptr2)
return -1;
else if (*(char*)ptr > *(char*)ptr2)
return 1;
}
return 0;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8 };
int str[] = { 1,2,3,8,9 };
int ret = memcpy(arr, str, 20);
if (ret > 0)
printf("arr > strn");
else if (ret < 0)
printf("arr1 < strn");
else
printf("arr1 == strn");
}
四、memset 内存设置
1.函数参数:
void * memset ( void * ptr, int value, size_t num );
- 第一个参数:ptr是指向待设置空间的指针
- 第二个参数:设置的参数
- 第三个参数:把num个(单位:字节)改为 第二个参数的值
- 是把ptr指向的的 num 个字节的空间,改为 value值
- 一般value设为0,设为1结果并不如预期哦
2.使用方式:
int main()
{
int arr[10] = { 0 };
memset(arr, 1, 8); //这里写1,并不能把前两个元素置为1,原因:在内存中实际上是01010101
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
总结
内存函数本质上与字符串函数的思想相近,不过在memset、以及模拟实现上需要注意,尤其要考虑内存中的存储方式。
最后
以上就是紧张香水为你收集整理的C语言内存函数详解&模拟实现(memcpy、memmove、memcmp、memset)内存函数总结的全部内容,希望文章能够帮你解决C语言内存函数详解&模拟实现(memcpy、memmove、memcmp、memset)内存函数总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复