关于拷贝时内存重叠与不重叠的问题
2018-03-13 15:36
274 查看
C++里有两种拷贝方式,一种是strcpy,一种是memcpy
实现如下:
#include<iostream>
using namespace std;
#include<assert.h>
char* MyStrcpy(char* dest,const char* src)
{
assert(src!=NULL&&dest!=NULL);
char* tmp = dest;
while (*src!='\0')
{
*(dest++) = *(src++);
}
*dest = '\0';
return tmp;
}
char* MyMemcpy(char*dest,const char* src,int n)
{
assert(dest != NULL&&src != NULL);
char* tmp = dest;
if (tmp >= src&&tmp <= src + n - 1)
{
tmp = tmp + n - 1;
src = src + n - 1;
while (n--)
{
*tmp-- = *src--;
}
*tmp = '\0';
}
else
{
while (n--)
{
*tmp++ = *src++;
}
*tmp = '\0';
}
return dest;
}
void test()
{
char s1[] = "hello";
char s2[] = "world";
cout << MyStrcpy(s1, s2) << endl;
cout << MyMemcpy(s1, s2, 3) << endl;
}在实现拷贝时需要注意几个细节:
1、返回值为char* ,因为返回dst的原始值使函数能够支持链式表达式。
链式表达式的形式如:
int l=strlen(strcpy(strA,strB));
又如:
char * strA=strcpy(new char[10],strB);
返回strSrc的原始值是错误的。
2、拷贝完成之后,要注意'\0'的拷贝是否被拷贝上了
3、传参时将源目标前加上const
实现如下:
#include<iostream>
using namespace std;
#include<assert.h>
char* MyStrcpy(char* dest,const char* src)
{
assert(src!=NULL&&dest!=NULL);
char* tmp = dest;
while (*src!='\0')
{
*(dest++) = *(src++);
}
*dest = '\0';
return tmp;
}
char* MyMemcpy(char*dest,const char* src,int n)
{
assert(dest != NULL&&src != NULL);
char* tmp = dest;
if (tmp >= src&&tmp <= src + n - 1)
{
tmp = tmp + n - 1;
src = src + n - 1;
while (n--)
{
*tmp-- = *src--;
}
*tmp = '\0';
}
else
{
while (n--)
{
*tmp++ = *src++;
}
*tmp = '\0';
}
return dest;
}
void test()
{
char s1[] = "hello";
char s2[] = "world";
cout << MyStrcpy(s1, s2) << endl;
cout << MyMemcpy(s1, s2, 3) << endl;
}在实现拷贝时需要注意几个细节:
1、返回值为char* ,因为返回dst的原始值使函数能够支持链式表达式。
链式表达式的形式如:
int l=strlen(strcpy(strA,strB));
又如:
char * strA=strcpy(new char[10],strB);
返回strSrc的原始值是错误的。
2、拷贝完成之后,要注意'\0'的拷贝是否被拷贝上了
3、传参时将源目标前加上const
相关文章推荐
- 内存拷贝要考虑地址重叠问题啊!!!
- 关于cout,wcout输出的测试,以及printf,wprintf 输出中文,内存中直接输出图像给网页问题
- iOS指南系列:如何解决奔溃问题-关于内存访问续
- 黄聪:VS2010 拷贝剪切代码的时候提示无足够可用内存的问题
- 关于STL中string的拷贝问题
- 几个关于Java内存泄露方面的问题
- 几个关于内存的问题
- 关于C中的内存分配问题
- 关于JNI内存泄露问题
- 关于 MFC 绘制 JPG图像 问题 -- 无敌使用fread 获取图像到内存中
- 关于python中深拷贝与浅拷贝问题
- iOS指南系列:如何解决奔溃问题-关于内存访问续2
- 关于QTableWidget的item所占内存的释放问题 .
- 关于C++内存问题(转)
- 关于const和define的内存分配问题的总结
- 关于Poi读取Excel引发内存溢出问题的解决方法
- 关于深浅拷贝问题
- 关于pragma pack的用法(四) C++中的内存对齐问题
- 关于Windows Server 2008某些版本不支持大内存问题
- 关于C++的new是否会对内存初始化的问题