memory拷贝与string拷贝的区别
1、memory拷貝,根據(jù)拷貝的字節(jié)個(gè)數(shù),從src一個(gè)一個(gè)字節(jié)拷貝到dst,拷貝過程不管src的取值,也不管dst是否能容納。
2、因此,對于memory拷貝,src中NULL字符(取值為0的字符)后面的字符也能拷貝過去。不管dst是否能容納,都拷貝過去,會(huì)存在踩內(nèi)存。為了避免踩內(nèi)存,拷貝的字節(jié)個(gè)數(shù),需要小于等于dst分配的大小。
3、string拷貝,遇到src的NULL字符結(jié)束。因此,strcpy有兩個(gè)問題特別需要注意:一,src結(jié)尾必須要有NULL字符,否則會(huì)一直拷貝下去,直到遇到NULL字符。二,dst在src有效長度的基礎(chǔ)上,要多分配一個(gè)字符,用于保存NULL字符,如果沒有多分配這個(gè)字符,會(huì)導(dǎo)致拷貝到dst的時(shí)候,踩一個(gè)字節(jié)的內(nèi)存。
4、src沒有NULL字符,會(huì)一直拷貝下去,直到遇到NULL字符,怎么解決這個(gè)問題?
使用strncpy,表示最多拷貝n個(gè)字節(jié)。如果不到n個(gè)字節(jié),遇到src中的NULL字符,結(jié)束拷貝,并且從當(dāng)前點(diǎn)到n位置,補(bǔ)充NULL。這一點(diǎn)和memory拷貝不同,memcpy不管src的取值,都會(huì)拷貝n個(gè)字節(jié)。
5、注意:
string src ="abcdabcd";
char* dst = new char[8];
strcpy(dst,src.c_str()); // 踩內(nèi)存,src多出一個(gè)NULL,而dst分配的內(nèi)存不夠
strncpy(dst,src.c_str(),8);// 不踩內(nèi)存
memcpy(dst,src.c_str(),8); // 不踩內(nèi)存
strncpy和memcpy不踩內(nèi)存,但是會(huì)導(dǎo)致dst沒有結(jié)束符。這往往會(huì)出現(xiàn)問題,比如dst再拷貝到其他地方。因此,解決辦法最好是 dst多分配一個(gè)字符,用于保存NULL,并且初始化dst,如下:
char* dst = new char[src.size()+1];
memset(dst,0,src.size()+1);
轉(zhuǎn)載于:https://www.cnblogs.com/nzbbody/p/4604633.html
總結(jié)
以上是生活随笔為你收集整理的memory拷贝与string拷贝的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兄弟打印机内存已满清零方法_brothe
- 下一篇: 物理机安装ESXI6.7提示No Net