strcpy和memcpy的差别

strcpy和memcpy的差别

大家好,又见面了,我是全栈君。

strcpy和memcpy都是标准C库函数。它们有以下的特点。

strcpy提供了字符串的复制。

即strcpy仅仅用于字符串复制。而且它不仅复制字符串内容之外,还会复制字符串的结束符,strcpy_s更安全。

已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);

返回值是char*是为了链式表达。

memcpy提供了一般内存的复制。即memcpy对于须要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count );

char 
*
strcpy
(
char 
* dest,
const 
char 
* src)
// 实现src到dest的复制
{
  
if 
((src==NULL)||(dest == NULL))
//推断參数src和dest的有效性
  {
      
return 
NULL;
  }
  
char 
*strdest=dest;      
//保存目标字符串的首地址
  
while 
((*strDest++ = *strSrc++)!=
'\0'
);
//把src字符串的内容拷贝到dest下
  
return 
strdest;
}

strcpy_s是strcpy的安全版本号,它之所以安全,是由于其在拷贝字符串的时候会有越界的检查工作。下面是strcpy_s的实现代码,在tcscpy_s.inl文件能够找到:
參考http://www.cnblogs.com/chenkunyun/archive/2012/03/20/2408365.html

errno_t __cdecl _FUNC_NAME(_CHAR *_DEST,
size_t
_SIZE,
const
_CHAR *_SRC)
{
    
_CHAR *p;
    
size_t
available;
  
    
/* validation section */
    
_VALIDATE_STRING(_DEST, _SIZE); //VALIDATE_STRING应该是验证字符串的合法性,是否以null结尾。


    
_VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE); //__VALIDATE_POINTER_RESET_STRING应该是记录字符串的原始信息,以便拷贝失败以后恢复
  
    
p = _DEST;
    
available = _SIZE;
    
while
((*p++ = *_SRC++) != 0 && --available > 0)
    
{
    
}
  
    
if
(available == 0)
    
{
        
_RESET_STRING(_DEST, _SIZE); //
        
_RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE); //当目的地空间不够时,会依据_VALIDATE_POINTER_RESET_STRING记录的信息恢复字符串,而且(在Debug模式下)以弹出对话框的形式报告错误。
    
    
_FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
    
_RETURN_NO_ERROR;
}

_FILL_STRING完毕在字符串最后加上null结束符的工作

void 
*
memcpy
(
void 
*memTo,
const 
void 
*memFrom,
size_t 
size)
{
  
if
((memTo==NULL)||(memFrom == NULL))
//memTo和memFrom必须有效
         
return 
NULL;
  
char 
*tempFrom=(
char 
*)memFrom;            
//保存memFrom首地址
  
char 
*tempTo=(
char 
*)memTo;                 
//保存memTo首地址     
  
while
(size-->0)               
//循环size次,复制memFrom的值到memTo中
       
  *tempTo++=*tempFrom++ ; 
  
return 
memTo;
}

strcpy和memcpy主要有下面3方面的差别。

1、复制的内容不同。strcpy仅仅能复制字符串,而memcpy能够复制随意内容,比如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不须要指定长度,它遇到被复制字符的串结束符”\0″才结束,所以easy溢出。

memcpy则是依据其第3个參数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy。而须要复制其它类型数据时则一般用memcpy

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115219.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月7日 下午1:00
下一篇 2022年2月7日 下午2:00


相关推荐

  • 头文件里面的ifndef /define/endif的作用

    c,c++里面,头文件里面的ifndef/define/endif的作用今天和宿舍同学讨论一个小程序,发现有点地方不大懂······是

    2021年12月25日
    53
  • 虚函数后面的分号可有可无_虚函数需要实现吗

    虚函数后面的分号可有可无_虚函数需要实现吗const 和 =0要分开理解.首先理解一下分开的意思成员函数后面用 const 修饰,const表示this是一个指向常量的指针,即对象成为一个常量,即它的成员不能够变化.(默认情况下,this的类型是指向类类型非常量版本的常量指针。例如在Sales_data成员函数中,this的类型是Sales_data *const,即类一旦实例化一个对象后,this指向这个对象,是不能改变的,但是对象…

    2022年8月18日
    9
  • 【原创动画】真封神南极服务端2.52版本介绍原创动画

    【原创动画】真封神南极服务端2.52版本介绍原创动画【原创动画】真封神南极服务端2.52版本介绍原创动画介绍了真封神服务端的使用及简单版本介绍下载地址:http://pan.baidu.com/s/1rbgEyhttp://pan.baidu.com/s/1rbgEy

    2022年7月24日
    15
  • 等价无穷小公式_高数八个重要极限公式

    等价无穷小公式_高数八个重要极限公式

    2022年8月11日
    18
  • 调和函数与全纯函数

    调和函数与全纯函数全纯函数的实部和虚部是调和函数 这是很显然的 自然的要问一个问题 如果 u 是区域 D 上的调和函数 那么是否一定存在一个函数 f inH D 使得 rmRe f u 成立呢 一般来讲这个结论不对的 但是如果限制区域 D 是单连通的 那么结论就对了 下面给出这个结论的证明 注意到 Deltau 0 而且 D 单连通 从而 u y rmd x

    2026年3月18日
    3
  • 雷达信号处理—线性调频信号脉冲压缩MATLAB实现

    雷达信号处理—线性调频信号脉冲压缩MATLAB实现关于脉冲压缩的原理以及公式推导这里不再赘述 主要讲解如何通过 MATLAB 进行仿真 实现原理脉冲压缩是为了解决雷达作用距离与距离分辨率这一矛盾关系而产生的技术 普通雷达在提升雷达作用距离的同时 会使得距离分辨率下降许多 反之亦然 而脉冲压缩雷达发射的是大时宽带宽积的射频信号 这保证了雷达的作用距离 同时 接收端会对发射信号做脉冲压缩处理 得到形似 sinc 函数的信号 该信号具有很好的距离分辨能力 在接收端的具体实现过程如下图 其中 是雷达回波信号 是脉冲压缩的输出

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号