zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    Linux系统挂载存储只读改成读写
    Linux kernel调试方法
    Linux设备树文件结构与解析深度分析
    #undef常用法
    Linux驱动中的platform总线分析
    在根文件系统中查看设备树(有助于调试)
    友元及操作符重载
    STM32 FLASH 擦除(以及防止误擦除程序代码)、写入
    C++学习笔记49:栈
    C++学习笔记48:链表的基本操作
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4604633.html
Copyright © 2011-2022 走看看