如果两段内存重叠,用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;
		pStr2+=n-1;
		for(size_t i=0;i!=n;++i)
		{
			*(pStr1--)=*(pStr2--);
		}
	}
	return (str1);
}
int main()
{
	// 内存重叠
	char c1[] = "hello world";
	memmove(c1+3, c1, 8);
	cout<<"memmove result:   "<<c1<<endl; //输出结果:helhello wo

	memcpy(c1+3,c1,8);
	//cout<<"memcpy:   "<<c1<<endl;  // <span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">输出</span><span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">结果:</span><span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">helhelhell0</span>

	// 内存不重叠
	char c2[] = "hello world";
	char c3[] = "love you";
	memmove(c2,c3,8);
	//cout<<"memmove result:"<<c2<<endl;//<span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">输出结果:</span><span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">love yourld</span>

	memcpy(c2,c3,8);
	cout<<"memcpy:   "<<c2<<endl; //输出结果:love yourld

	memcpy(c1+3,c1,8);

}
时间: 2024-10-11 02:11:50

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

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

[整理]内存重叠之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能够保证源串在被覆盖之

C语言之memcpy函数

昨天自己动手实现memcpy这个函数,用一个例程试了一下,结果正确,满心欢心,可是有些地方想不明白,于是百度了一下,结果自己写的函数简直无法直视. 觉得还是写个总结,以示教训. 先贴上我自己的函数: [cpp] view plain copy  char *mymemcpy(char *dest, const char * src, int n) { char *pdest; char *psrc; pdest = dest; psrc = src; for(n; n>0; n--) { *pd

【转】【C/C++】实现memcpy函数

本文转自:http://my.oschina.net/renhc/blog/36345 面试中如问到memcpy的实现,那就要小心了,这里有陷阱. 先看下标准memcpy()的解释: ? 1 2 void *memcpy(void *dst, const void *src, size_t n); //If copying takes place between objects that overlap, the behavior is undefined. 注意下面的注释,对于地址重叠的情况,

【两段连续不重合子序列和最大】 动态规划

最大子序列 TimeLimit: 1 Second MemoryLimit: 32 Megabyte Totalsubmit: 156 Accepted: 42 Description 给定一个N个整数组成的序列,整数有正有负,找出两段不重叠的连续子序列,使得它们中整数的和最大.两段子序列都可以为空. Input 多组输入,每组第一行为N,表示序列的长度:第二行为N个整数,表示输入序列.0<N<=1,000,000 Output 对于每组输入,输出一行,仅一个整数,表示最大的和. Sample

&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不能复制内存重叠区域

下面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

【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

memcpy函数、strcpy函数、strncpy函数

一.函数说明 1.memcpy函数 void  *memcpy(void *s1,  const void *s2,  size_t  n); 说明: 函数memcpy从s2指向的对象中复制n个字符到s1指向的对象中.如果复制发生在两个重叠的对象中,则这种行为未定义. 返回值: 函数memcpy返回s1的值. 2.strcpy函数 char  *strcpy(char *s2, const char *s1); 说明: 函数strcpy把s1指向的串(包括空字符)复制到s2指向的数组中.如果复制