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);
轉載于:https://www.cnblogs.com/nzbbody/p/4604633.html
總結
以上是生活随笔為你收集整理的memory拷贝与string拷贝的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兄弟打印机内存已满清零方法_brothe
- 下一篇: 物理机安装ESXI6.7提示No Net