http://blog.csdn.net/li_ning_/article/details/51418400

下面s和s2指向的内存区域有重叠,memcpy不能正确复制,src赋值给dst时,可能会修改自身的值

char s[] = "abcdefghij";
char *s2 = s + ;
memmove(s2, s, strlen(s2)+);//s2的最后一个未知 为'\0'字符,从s位置开始复制,不能多一个元素覆盖了结尾的‘\0'
cout << s2 << endl;//只复制strlen(s2)个字节,s2输出abcdef,strlen(s2)的值为6
cout << strlen(s2) << endl;//复制strlen(s2)+1个字节,s2结尾不是'\0',strlen(s2)的值为23

s2的位置是第4个,s是第0个,strlen(s2)的长度为efghij占用的内存空间,共五个字节

重叠分两种情况,src的位置在dst指向区域子内,dst位置在src之内;memmove的第三个参数应该不大于dst指向的内存区域长度

void *memmove(void*dst,void*src, size_t num) size_t是无符号整数

dst>src,正向拷贝,memcpy可处理;dst<src,需要反向拷贝,memcpy不能处理这种情况

 struct {
char name[];
int age;
} person, person_copy;
void *Memmove(void*dst, void*src, int size_t)
{
if (dst == NULL || src == NULL) return NULL; //正向逐字节拷贝,反向逐字节拷贝,没有检测要拷贝的字节数超出dst指向的内存区域;dst=src,什么也不做
if (dst < src) {
char *p = (char*)(dst);
char *q = (char*)(src);
while (size_t)
{
*p++ = *q++;
size_t--;
}
}
if (dst > src){
char *p = (char*)(dst)+size_t - ;
char *q = (char*)(src)+size_t - ;
while (size_t)
{
*p-- = *q--;
size_t--; }
} return dst;
} int main()
{
char s[] = "abcdefghij";
char *s2 = s + ;
memmove(s2, s, strlen(s2));//s2的最后一个未知 为'\0'字符,从s位置开始复制,不能多一个元素覆盖了结尾的‘\0'
cout << s2 << endl;//只复制strlen(s2)个字节,s2输出abcdef,strlen(s2)的值为6
cout << strlen(s2) << endl;//复制strlen(s2)+1个字节,s2结尾不是'\0',strlen(s2)的值为23
char *s3 = s + ;
cout << s << endl;
memmove(s3, s2, strlen(s3));
cout << s3 << endl;
cout << s << endl;
return ;
}
//int main()
//{
// int i = 0;
// int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// int arr2[10] = { 0 };
// int arr3[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// cout << sizeof(arr1) << endl;
// Memmove(arr2, arr1, sizeof(arr1));
// Memmove(arr3 + 5, arr3 + 4, 3 * sizeof(int));
// for (i = 0; i < 10; i++)
// {
// printf("%d ", arr2[i]);
// }
// printf("\n");
// for (i = 0; i < 10; i++)
// {
// printf("%d ", arr3[i]);
// }
// system("pause");
// return 0;
//}

memcpy不能复制内存重叠区域,memmove可以拷贝重叠内存的更多相关文章

  1. C语言标准库函数memcpy和memmove的区别以及内存重叠问题处理

    ①memcpy()和memmove()都是C语言中的标准库函数,定义在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, cons ...

  2. 内存操作函数memmove,memcpy,memset

    通过字符串的学习,我们知道字符串操作函数的操作对象是字符串,并且它的结束标志是结束符\0,当然这个说的是不 受限制的字符串函数.然而当我们想要将一段内存的数据复制到另一块内存时,我们不能使用字符串操作 ...

  3. 【C语言】模拟实现memmove函数(考虑内存重叠)

    //模拟实现memmove函数(考虑内存重叠) #include <stdio.h> #include <assert.h> #include <string.h> ...

  4. JDK1.8-Java虚拟机运行时数据区域和HotSpot虚拟机的内存模型

    目录 介绍 官方文档规定的运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈溢出 Java堆 演示堆内存溢出 方法区 运行时常量池 演示方法区溢出 HotSpot虚拟机的内 ...

  5. 【OpenCV学习】计算两幅图像的重叠区域

    问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图 ...

  6. JVM内存各个区域分工简单介绍

    JVM内存各个区域简单介绍: 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 在使用多线程时,为了线程切换后能恢复到正确的执行位置,每条线程都需要有个独立 ...

  7. java内存区域,jvm内存各个区域详解

    一.运行时数据区域 1.如图所示,可分为如下几个区域. 2.程序计数器 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的 ...

  8. 转载: Java虚拟机:运行时内存数据区域、对象内存分配与访问

    转载:  https://blog.csdn.net/a745233700/article/details/80291694  (虽然大部分内容都其实是深入理解jvm虚拟机这本书里的,不过整理的很牛逼 ...

  9. 快速串讲——JVM内存的区域划分

    目的 快速定位JVM内存泄漏或者溢出等问题. 面试基础题,加分项. 文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍. 程序计数器(Progra ...

随机推荐

  1. Windows注册表内容详解

    Windows注册表内容详解 http://blog.sina.com.cn/s/blog_4d41e2690100q33v.html (2011-04-05 10:46:17)   第一课  注册表 ...

  2. .NET的优点(转载)

    一:什么是.NET?它包括什么? .Net是为简化在第三代因特网的高分布式环境下的应用程序开发,基于开放互联网标准和协议之上,实现异质语言和平台高度交互性,而构建的新一代计算和通信平台. .Net主要 ...

  3. TP框架中的M、D、C、I、A、S方法

    M方法 M实例化参数是数据库的表名 //使用M方法实例化$User = M('User');//和用法$User = new /Think/Model ('User');等效//执行其他的数据操作$U ...

  4. 安装webpack的流程及注意事项

    1)webpack依赖于node.js(node.js使用npm安装我们所依赖的js包) 2)安装npm(npm 全称是Node Package Manager,他是node包管理和分发工具) 3)通 ...

  5. Vue/React如何优雅的一劳永逸的注册路由及组件

    原文链接: 本人掘金文章  假如图片看不清晰可前往掘金原文预览 官方文档: 组建注册 路由注册 未优化版: 在Vue官方文档 中,我们通过  Vue.component('MyComponentNam ...

  6. Array数组的使用

    public class ArrayDemo { public static void main(String[] args) { int[] arr = {13,44,55,667,67,78}; ...

  7. C# ASP.NET发送电子邮件System.Net.Mail

    1.补充知识 (1)POP3和SMTP服务器是什么? 简单点来说:POP3 用于接收电子邮件 ,SMTP 用于发送电子邮件. (1)POP3具体指什么? POP3(Post Office Protoc ...

  8. xargs 将标准输入转换成命令行参数

    1. 命令功能 xargs 命令过滤器,接收管道或者标准输入传递的数据转换成xargs命令. 2. 语法格式 xargs [option] xargs  选项 参数 参数说明 -n 指定每行的最大参数 ...

  9. NOIP原题板刷

    update 10.11 我可能已经刷完大部分了,可是这篇blog我也不想更了 这个人很懒,做了很多题但是不想写题解,也不想更blog,所以这篇blog又咕咕了. 把从 \(1997-2017\) 近 ...

  10. 为啥HashMap的默认容量是16

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map& ...