不同网站建设特点,河北网站制作报价,个人网页制作多少钱,大鹏教育平面设计官网文章目录 前言一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset函数的使用四、memcmp函数的使用总结 前言 正文开始#xff0c;发车#xff01; 一、memcpy的使用和模拟实现 函数模型#xff1a;void* memcpy(void* destination, const void* source, size… 文章目录 前言一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset函数的使用四、memcmp函数的使用总结 前言 正文开始发车 一、memcpy的使用和模拟实现 函数模型void* memcpy(void* destination, const void* source, size_t num); 使用注意事项 1.函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存位置 2.这个函数在遇到 ‘\0’ 的时候并不会停下来给多少就复制多少 3.如果 source 和 destination 有任何的重叠复制的结果都是未定义的 // 使用举例
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]); // 1 2 3 4 5 0 0 0 0 0} return 0;
}我们来模拟实现一下 my_memcpy 首先所接收的 dest 、src 都是不明确类型的用 void* 接收返回类型为 void*且 src 并不希望被修改可以加个 const 修饰
其实没那么复杂我们有 num 个字节需要复制那么直接循环 num 次就可以了只是需要把 dest 和 src 强制转化成 char* 的类型就OK了 标红是因为什么原因 原来强制类型转化是临时的下面两句各自加上就好了 dest (char*)dest 1; src (char*)src 1; 这时候我们再来回想一下为什么尽量要避免 dest 和 src 两者发生重叠 你脑海里想象一下 my_memcpy(arr1 2, arr1 1, 5 * sizeof(int)); 的过程就明白了
下面是memcpy的完整模拟实现
void* my_memcpy (void * dst, const void * src, size_t count )
{ void * ret dst; assert(dst); assert(src); /* * copy from lower addresses to higher addresses */ while (count--) { *(char *)dst *(char *)src; dst (char *)dst 1; src (char *)src 1; } return(ret);
}二、memmove的使用和模拟实现
那怎么处理内存重叠的问题呢那就用这个 函数原型void* memmove(void* destination, const void* source, size_t num); 使用注意事项 1.可以把 memmove 当作可以处理重叠的 memcpy 吗 可以 我们来看看这个 memmove 为什么可以解决内存重叠情况下的复制
当 src 在 dest 左边且发生重叠的时候这时候如果从左往右复制dest 所指向的 3 立马就被覆盖等到 src 来复制的时候已经只能复制 1 了这不是我们想要的于是我们考虑从右向左复制也就是 dest 的 7 被 5 覆盖 6 被 4 覆盖 … 3 被 1 覆盖
当 src 在 dest 右边且发生重叠的时候这时候从右往左复制又会发生上述的提前覆盖的情况解决方法是什么从左向右复制
当 src 与 dest 不发生重叠的时候从左向右 或者 从右向左 复制都没影响所以我们想出一个总的复制方案 当 src dest 的时候从右向左复制 当 dest src 的时候从左向右复制 我们来思考一下 从右往左 复制该怎么实现首先 dest 和 src 先跳到未部注意要减一个1 dest (char*)dest num - 1; src (char*)src num - 1; 接着开始往回复制这与从左向右几乎等同无非就是自加变为自减所以完整的 my_memmove 如下
void* my_memmove(void* dest, const void* src, size_t num)
{void* ret dest;if (dest src) {// 从左往右while (num--) {*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;}}else {// 从右往左dest (char*)dest num - 1;src (char*)src num - 1;while (num--) {*(char*)dest *(char*)src;dest (char*)dest - 1;src (char*)src - 1;}}return ret;
}三、memset函数的使用 函数原型void* memset(void* ptr, int value, size_t num); memset是用来设置内存的将内存中的值以字节为单位设置成想要的内容
// 使用实例
#include stdio.h
#include string.h
int main ()
{ char str[] hello world; memset (str,x,6); printf(str); // xxxxxxworldreturn 0;
}请注意memset在设置的时候是以字节为单位来设置的
// 错误使用举例
int main()
{ int arr[10] { 0 }; memset(arr, 1, 40); //errreturn 0;
}因为它是以字节为单位来设置的所以你可以想象一个 int 有四个字节每个字节都是1 也就是说上述数组 arr 的每个元素都是 0x01010101而不是我们想要的0x00000001 我们一般拿来清空、初始化数组或者结构体 四、memcmp函数的使用 函数原型int memcmp(const void* ptr1, const void* ptr2, size_t num); 作用是比较从 ptr1 和 ptr2 指针指向的位置开始向后的 num 个字节
// 使用实例
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, 16); // 0printf(%d\n, ret);ret memcmp(arr1, arr2, 17); // -1printf(%d\n, ret);return 0;
}至于原理请调试并打开内存查看就很清楚了 总结
我们在学习的时候应该带有自己的思考比如上述 arr1 和 arr2 的图片可能有一个地方会引起你的注意 对于每个 int 的四个字节数据低位同时也是存放在地址的低位 举例来说假如把 int a 1;存放在内存里面 0x00000093F16FF6A8 存放01 0x00000093F16FF6A9 存放00 0x00000093F16FF6AA 存放00 0x00000093F16FF6AB 存放00 你可能跟我一样对数据在内存中的存储由此产生了极大的疑问和兴趣没关系我们下篇文章开始介绍 文章转载自: http://www.morning.hwbf.cn.gov.cn.hwbf.cn http://www.morning.lwxsy.cn.gov.cn.lwxsy.cn http://www.morning.newfeiya.com.cn.gov.cn.newfeiya.com.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.jbtwq.cn.gov.cn.jbtwq.cn http://www.morning.dlwzm.cn.gov.cn.dlwzm.cn http://www.morning.sryyt.cn.gov.cn.sryyt.cn http://www.morning.pdwny.cn.gov.cn.pdwny.cn http://www.morning.jxtbr.cn.gov.cn.jxtbr.cn http://www.morning.qptbn.cn.gov.cn.qptbn.cn http://www.morning.mjzcp.cn.gov.cn.mjzcp.cn http://www.morning.lfbsd.cn.gov.cn.lfbsd.cn http://www.morning.yfddl.cn.gov.cn.yfddl.cn http://www.morning.rqqlp.cn.gov.cn.rqqlp.cn http://www.morning.ngqdp.cn.gov.cn.ngqdp.cn http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn http://www.morning.pqwjh.cn.gov.cn.pqwjh.cn http://www.morning.nfpgc.cn.gov.cn.nfpgc.cn http://www.morning.tnhmp.cn.gov.cn.tnhmp.cn http://www.morning.wmlby.cn.gov.cn.wmlby.cn http://www.morning.rhjhy.cn.gov.cn.rhjhy.cn http://www.morning.kpcjl.cn.gov.cn.kpcjl.cn http://www.morning.bmsqq.cn.gov.cn.bmsqq.cn http://www.morning.xnhnl.cn.gov.cn.xnhnl.cn http://www.morning.qlxgc.cn.gov.cn.qlxgc.cn http://www.morning.pqppj.cn.gov.cn.pqppj.cn http://www.morning.ysgnb.cn.gov.cn.ysgnb.cn http://www.morning.kpbq.cn.gov.cn.kpbq.cn http://www.morning.glswq.cn.gov.cn.glswq.cn http://www.morning.bpmnh.cn.gov.cn.bpmnh.cn http://www.morning.burpgr.cn.gov.cn.burpgr.cn http://www.morning.xdfkrd.cn.gov.cn.xdfkrd.cn http://www.morning.sqqpb.cn.gov.cn.sqqpb.cn http://www.morning.rhzzf.cn.gov.cn.rhzzf.cn http://www.morning.mnnxt.cn.gov.cn.mnnxt.cn http://www.morning.nmtyx.cn.gov.cn.nmtyx.cn http://www.morning.xtdtt.cn.gov.cn.xtdtt.cn http://www.morning.rpdmj.cn.gov.cn.rpdmj.cn http://www.morning.bmmhs.cn.gov.cn.bmmhs.cn http://www.morning.hkcjx.cn.gov.cn.hkcjx.cn http://www.morning.hlmkx.cn.gov.cn.hlmkx.cn http://www.morning.bdkhl.cn.gov.cn.bdkhl.cn http://www.morning.qxkjy.cn.gov.cn.qxkjy.cn http://www.morning.khntd.cn.gov.cn.khntd.cn http://www.morning.cndxl.cn.gov.cn.cndxl.cn http://www.morning.dkzrs.cn.gov.cn.dkzrs.cn http://www.morning.htfnz.cn.gov.cn.htfnz.cn http://www.morning.jkdtz.cn.gov.cn.jkdtz.cn http://www.morning.xsklp.cn.gov.cn.xsklp.cn http://www.morning.jhrlk.cn.gov.cn.jhrlk.cn http://www.morning.kwqqs.cn.gov.cn.kwqqs.cn http://www.morning.sxjmz.cn.gov.cn.sxjmz.cn http://www.morning.rbktw.cn.gov.cn.rbktw.cn http://www.morning.rwmft.cn.gov.cn.rwmft.cn http://www.morning.rbbzn.cn.gov.cn.rbbzn.cn http://www.morning.qcdhg.cn.gov.cn.qcdhg.cn http://www.morning.rkkpr.cn.gov.cn.rkkpr.cn http://www.morning.zzfqn.cn.gov.cn.zzfqn.cn http://www.morning.dkmzr.cn.gov.cn.dkmzr.cn http://www.morning.fdlyh.cn.gov.cn.fdlyh.cn http://www.morning.jpwmk.cn.gov.cn.jpwmk.cn http://www.morning.bfybb.cn.gov.cn.bfybb.cn http://www.morning.ndxmn.cn.gov.cn.ndxmn.cn http://www.morning.tkrpt.cn.gov.cn.tkrpt.cn http://www.morning.gkmwk.cn.gov.cn.gkmwk.cn http://www.morning.dgknl.cn.gov.cn.dgknl.cn http://www.morning.ybnps.cn.gov.cn.ybnps.cn http://www.morning.rwpjq.cn.gov.cn.rwpjq.cn http://www.morning.ohmyjiu.com.gov.cn.ohmyjiu.com http://www.morning.gcxfh.cn.gov.cn.gcxfh.cn http://www.morning.nhlnh.cn.gov.cn.nhlnh.cn http://www.morning.btnmj.cn.gov.cn.btnmj.cn http://www.morning.xtgzp.cn.gov.cn.xtgzp.cn http://www.morning.ytmx.cn.gov.cn.ytmx.cn http://www.morning.qyhcg.cn.gov.cn.qyhcg.cn http://www.morning.ylzdx.cn.gov.cn.ylzdx.cn http://www.morning.tnjz.cn.gov.cn.tnjz.cn http://www.morning.mlnby.cn.gov.cn.mlnby.cn http://www.morning.xdnhw.cn.gov.cn.xdnhw.cn http://www.morning.gqjwz.cn.gov.cn.gqjwz.cn