memory拷贝与string拷贝的区别
1、memory拷贝,根据拷贝的字节个数,从src一个一个字节拷贝到dst,拷贝过程不管src的取值,也不管dst是否能容纳。
2、因此,对于memory拷贝,src中NULL字符(取值为0的字符)后面的字符也能拷贝过去。不管dst是否能容纳,都拷贝过去,会存在踩内存。为了避免踩内存,拷贝的字节个数,需要小于等于dst分配的大小。
3、string拷贝,遇到src的NULL字符结束。因此,strcpy有两个问题特别需要注意:一,src结尾必须要有NULL字符,否则会一直拷贝下去,直到遇到NULL字符。二,dst在src有效长度的基础上,要多分配一个字符,用于保存NULL字符,如果没有多分配这个字符,会导致拷贝到dst的时候,踩一个字节的内存。
4、src没有NULL字符,会一直拷贝下去,直到遇到NULL字符,怎么解决这个问题?
使用strncpy,表示最多拷贝n个字节。如果不到n个字节,遇到src中的NULL字符,结束拷贝,并且从当前点到n位置,补充NULL。这一点和memory拷贝不同,memcpy不管src的取值,都会拷贝n个字节。
5、注意:
string src ="abcdabcd";
char* dst = new char[8];
strcpy(dst,src.c_str()); // 踩内存,src多出一个NULL,而dst分配的内存不够
strncpy(dst,src.c_str(),8);// 不踩内存
memcpy(dst,src.c_str(),8); // 不踩内存
strncpy和memcpy不踩内存,但是会导致dst没有结束符。这往往会出现问题,比如dst再拷贝到其他地方。因此,解决办法最好是 dst多分配一个字符,用于保存NULL,并且初始化dst,如下:
char* dst = new char[src.size()+1];
memset(dst,0,src.size()+1);
memory拷贝与string拷贝的区别的更多相关文章
- .net中String是引用类型还是值类型 以及 C#深层拷贝浅层拷贝
http://www.cnblogs.com/yank/archive/2011/10/24/2204145.html http://www.cnblogs.com/zwq194/archive/20 ...
- C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁
拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数 在我们没 ...
- 【转载】C++中的位拷贝和值拷贝
---恢复内容开始--- 原文:C++中的位拷贝和值拷贝 原文:http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以Strin ...
- C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理
定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成stri ...
- C语言中的位拷贝与值拷贝浅谈(转载)
注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象 ...
- scp linux远程拷贝和本地拷贝命令
linux远程拷贝和本地拷贝命令 一.linux对linux 远程拷贝 scp命令 scp 文件名 root@远程ip:/路径/ 将本地home目录下的test.tar的文件拷贝 ...
- 【转】C++中的位拷贝与值拷贝
[转]http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以String类为例: 首先定义String类,而并不实现其成员函数. ...
- C++ 拷贝构造函数、拷贝赋值运算符、析构函数
每一次都会忘,做个笔记吧.想到哪里写到哪里. 拷贝构造函数 第一个参数必须是自身类类型的引用,且任何额外参数都有默认值.(为什么必须是引用?见后解释) 合成拷贝构造函数:如果我们没有为一个类定义拷贝构 ...
- Python [拷贝copy / 深度拷贝deepcopy] | 可视化理解
Python 是一门面向对象的语言, 在Python一切皆对象. 每一个对象都有由以下三个属性组成: ------------------------------------------------- ...
随机推荐
- Echarts学习记录——如何去掉网格线及网格区域颜色
关键属性 splitLine和splitArea,可以设置相关的属性 示例代码 <!DOCTYPE html> <html lang="en"> <h ...
- 清华梦的粉碎—写给清华大学的退学申请(转自王垠Blog)
清华梦的诞生 小时候,妈妈给我一个梦.她指着一个大哥哥的照片对我说,这是爸爸的学生,他考上了清华大学,他是我们中学的骄傲.长大后,你也要进入清华大学读书,为我们家争光.我不知道清华是什么样子,但是我知 ...
- Java Deadlock Example and How to analyze deadlock situation
source:http://www.journaldev.com/1058/java-deadlock-example-and-how-to-analyze-deadlock-situation De ...
- UIScrollView的判断位置的属性如下:
contentSize:CGSize类型,scrollview可以滑动的区域,例如,一个view的frame为(0,0,320,480),而scrollview的contentSize为(320,10 ...
- .NET:枚举的默认值
.NET中的值类型默认都会设置为0,枚举也是如此,因此当你定义自己的枚举值类型且显式的指定了枚举值时,别忘记使用0,如果由于某种原因不能使用0,如使用了Flag标记,则别忘记在使用了枚举类型的构造方法 ...
- python测试开发django-25.表单提交之post注册案例
前言 一个网站上新用户注册,会写个注册页面,如果用django写个注册页面的流程呢? 本篇以post请求示例,从html页面上输入用户注册信息,提交到后台处理数据,然后传参数据到User数据库表里面 ...
- 护士当家第一至七季/全集Nurse Jackie迅雷下载
英文译名Nurse Jackie,第1-7季(2009-2015)Showtime. 本季看点:<护士当家>是一部黑色医务剧,该剧特别邀请到荣获艾美奖和金球奖的Edie Falco出演女主 ...
- 通过layer-list自定义EditText背景
假设activity的背景是白色,第一层也(就是最底层)是绿色:第二次是白色,但是距离底部有一段小偏移,目的是为了做出文本框两边的小勾:第三层也是白色,但是它距离底部和左右两边都有一定距离.通过三层配 ...
- 完美解决Invalid layout of java.lang.String at value问题的方法
:-(昨天一天没有写东西了,今晚略显有愧啊.昨天整理了下自己的电脑和桌面,把一些没有用和杂乱的东西都收拾收拾,于是一天就没了.今天赶快来补文章.本篇主要讲的是解决Invalid layout of j ...
- HttpURLConnection和HttpClient的简单用法
HttpURLConnection的简单用法:先通过一个URL创建一个conn对象,然后就是可以设置get或者是post方法,接着用流来读取响应结果即可 String html = null; lon ...