memcpy不能复制内存重叠区域

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

char s[] = "abcdefghij";
char *s2 = s + 4;
memmove(s2, s, strlen(s2)+1);//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之内

时间: 2024-08-01 17:57:16

memcpy不能复制内存重叠区域的相关文章

&lt;C语言&gt; C99 Restrict memcpy 内存重叠

https://my.oschina.net/zidanzzg/blog/812887 https://www.cnblogs.com/dylancao/p/9951838.html C语言关键字,编译器优化时使用,不要对编译器撒谎,如果把一个指针定义成Restrict , 编译器会相信你,并对程序进行优化,如果出现内存重叠的问题, 编译器不会替你排查.memcpy()会有内存重叠的问题,memove()会提前帮你检查是否有内存重叠的问题. visual studio 把函数和变量定义成 Res

[整理]内存重叠之memcpy、memmove

函数原型: void *memcpy( void *dest, const void *src, size_t count ); void *memmove( void* dest, const void* src, size_t count );  1.memcpy和memmove相同点都是用于从src拷贝count个字节到dest. 2.memcpy和memmove区别如果目标区域和源区域有重叠的话:memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖.memmove能够保证源串在被覆盖之

如果两段内存重叠,用memcpy函数可能会导致行为未定义

如果两段内存重叠,用memcpy函数可能会导致行为未定义,改进: void* memmove(void* str1,const void* str2,size_t n) { char* pStr1= (char*) str1; const char* pStr2=(const char*)str2; if (pStr1 < pStr2 ) { for(size_t i=0;i!=n;++i) { *(pStr1++)=*(pStr2++); } } else { pStr1+=n-1; pStr

memcpy(拷贝内存内容

/*memcpy(拷贝内存内容) 相关函数 bcopy,memccpy,memcpy,memmove,strcpy,strncpy 表头文件 #include<string.h> 定义函数 void * memcpy (void * dest ,const void *src, size_t n); 函数说明 memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上.与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束‘\0‘而结束.

C++中两块内存重叠的string的copy方法

如果两段内存重叠,用memcpy函数可能会导致行为未定义. 而memmove函数能够避免这种问题,下面是一种实现方式: 1 #include <iostream> 2 using namespace std; 3 void* memmove(void* str1,const void* str2,size_t n) 4 { 5 char* pStr1= (char*) str1; 6 const char* pStr2=(const char*)str2; 7 if (pStr1< pS

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

JVM内存各个区域简单介绍: 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 在使用多线程时,为了线程切换后能恢复到正确的执行位置,每条线程都需要有个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为"线程私有"的内存.如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址:如果正在执行的是Native方法,这个计数器值则为空(Undefined). 此内存区域是唯一一个在Java

计算两幅图像的重叠区域

http://www.cnblogs.com/dwdxdy/p/3232331.html 随笔- 87  文章- 0  评论- 81 [OpenCV学习]计算两幅图像的重叠区域 问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图,因而可以转换成图像匹配问题. 图像匹配问题,可以融合两幅图像,得到全景图,但无法标识出在原图像的重叠区域. 将两幅图像都

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

问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图,因而可以转换成图像匹配问题. 图像匹配问题,可以融合两幅图像,得到全景图,但无法标识出在原图像的重叠区域. 将两幅图像都理解为多边形,则其重叠区域的计算,相当于求多边形的交集. 通过多边形求交,获取重叠区域的点集,然后利用单应矩阵还原在原始图像的点集信息,从而标识出重叠区域. 算法步骤: 1.图像

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

//模拟实现memmove函数(考虑内存重叠) #include <stdio.h> #include <assert.h> #include <string.h> void * memmove(void * dst, const void * src, int count) { void * ret = dst; assert(dst); assert(src); if (dst <= src || (char *)dst >= ((char *)src