在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1.与字符串函数strcpy区别:
2.函数说明:
3.拷贝情况: 拷贝的具体过程根据dst内存区域和src内存区域可分为三种情况: 1.当src内存区域和dst内存区域完全不重叠 2.当src内存区域和dest内存区域重叠时且dst所在区域在src所在区域前 3.当src内存区域和dst内存区域重叠时且src所在区域在dst所在区域前
上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。 4.代码实现 memcpy: void* _memcpy(void* dest, const void* src, size_t count) { assert(src != nullptr&&dest != nullptr); //判断dest指针和src指针是否为空,若为空抛出异常 char* tmp_dest = (char*)dest; const char* tmp_src = (const char*)src; //将指针dest和指针src由void强转为char, //使得每次均是对内存中的一个字节进行拷贝 while (count--) *tmp_dest++ = *tmp_src++; return dest; } memmove: void* _memmove(void* dest, const void* src, size_t count) { assert(src != nullptr&&dest != nullptr); //判断dest指针和src指针是否为空,若为空抛出异常 char* tmp_dest = (char*)dest; const char* tmp_src = (const char*)src; if (tmp_src < tmp_dest)//当src地址小于dest地址时,从头进行拷贝 while (count--) *tmp_dest++ = *tmp_src++; else if (tmp_src > tmp_dest)//当src地址大于dest地址时,从后进行拷贝 { tmp_src += count - 1; tmp_dest += count - 1; while (count--) *tmp_dest-- = *tmp_src; } //else(tmp_src==tmp_dest) 此时不进行任何操作 return dest; }
CSDN地址:http://blog.csdn.net/lyl_312/article/details/51419822 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论