`
AquariusM
  • 浏览: 147346 次
  • 性别: Icon_minigender_1
  • 来自: 南阳
社区版块
存档分类
最新评论

memset - memcpy - strcpy 的区别

阅读更多

这些函数的区别在于 实现功能 以及 操作对象 不同。

strcpy 函数操作的对象是 字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能。

snprintf 函数操作的对象 不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现 (字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字符串拷贝功能。

memcpy 函数顾名思义就是 内存拷贝,实现 将一个 内存块 的内容复制到另一个 内存块 这一功能。内存块由其首地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy 的操作对象不局限于某一类数据类型,或者说可 适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于 memcpy 函数等长拷贝的特点以及数据类型代表的物理意义,memcpy 函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。

对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同:

 

  • strcpy 无疑是最合适的选择:效率高且调用方便。

     

     

  • snprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。

     

     

  • memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度 + 1),还会带来性能的下降。其实 strcpy 函数一般是在内部调用 memcpy 函数或者用汇编直接实现的,以达到高效的目的。因此,使用 memcpy 和 strcpy 拷贝字符串在性能上应该没有什么大的差别。

 

对于非字符串类型的数据的复制来说,strcpy 和 snprintf 一般就无能为力了,可是对 memcpy 却没有什么影响。但是,对于基本数据类型来说,尽管可以用 memcpy 进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下 memcpy 几乎不被使用。memcpy 的长处是用来实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。

另外,

strcpy和memcpy功能上也有些差别:

比如:

const char *str1="abc\0def";

char str2[7];

首先用strcpy实现:

strcpy(str2,str1)

得到结果:str2="abc";也就是说,strcpy是以'\0'为结束标志的。

再用memcpy实现:

memset(str2,7);

memcpy(str2,str1,7);

得到结果:str2="abc\0def";

也就是说,memcpy是对内存区域的复制。当然,不仅能够复制字符串数组,而且能够复制整型数组等其他数组。

 

 

 

 原文地址 http://bbs.chinaunix.net/thread-655146-1-1.html

分享到:
评论

相关推荐

    memset,memcpy,strcpy 的用法

    memset,memcpy,strcpy 的用法,详细区别还有优缺点对比!

    Memset、Memcpy、Strcpy 的作用和区别

    总结一下,Memset、Memcpy和Strcpy的主要区别在于它们各自的操作对象和目的:Memset用于对内存进行设置,通常是初始化;Memcpy用于内存对象的拷贝,注重于复制的数据量;Strcpy用于字符串拷贝,重点在于字符串的复制...

    浅析C++中memset,memcpy,strcpy的区别

    在C++编程中,`memset`, `memcpy`, 和 `strcpy` 是三个经常使用的函数,用于处理内存区域的数据操作。它们各自有不同的用途和特点,本文将深入解析它们的区别。 `memset` 函数是用来设置一块内存区域的值。其原型为...

    C语言 strcpy和memcpy区别详细介绍

    `strcpy`和`memcpy`的主要区别如下: 1. **复制内容不同**:`strcpy`只能复制字符串,即以`\0`结尾的字符序列;而`memcpy`可以复制任何类型的数据,包括字符数组、整型、结构体或类对象等。 2. **复制方法不同**:...

    C/C++笔试题库 (整理版)

    4. 内存操作:理解memset、memcpy和strcpy的区别 在C/C++语言中,memset、memcpy和strcpy都是内存操作函数,它们的区别在于其功能和使用方式。memset函数用于将一段内存空间设置为某个字符,例如memset(a, '\0', ...

    memset()的用法.pdf

    总结来说,`memset()`、`memcpy()`和`strcpy()`都是C语言中处理内存操作的重要工具。`memset()`用于填充内存区域,`memcpy()`用于安全地复制内存,而`strcpy()`则专门用于字符串的复制。理解并正确使用这些函数对于...

    c 语言中的memset函数.pdf

    在C语言中,`memset`是一个非常实用的函数,用于对内存区域进行快速初始化,通常用于设置内存块的每个字节为同一特定值。...理解它的工作原理以及与其他内存操作函数(如`memcpy`和`strcpy`)的区别是至关重要的。

    C,C++经典问题,及面试笔试题

    4. **memset, memcpy, strcpy 的区别**: - `memset`:用于将一块内存区域设置为特定的字节值,通常用于初始化数组或填充 '\0'。 - `memcpy`:用于从源内存区域复制到目标内存区域,可以跨类型复制,必须确保目标...

    strcpy的使用 (2).pdf

    "strcpy 函数的使用注意事项" strcpy 函数是 C 语言中最常用的字符串复制函数,但是在使用时需要注意一些重要的事项,以免出现缓冲溢出和其他严重问题。在这里,我们将详细地介绍 strcpy 函数的使用注意事项和如何...

    c++ 面试题 总结

    memset(a,0,sizeof(a)); int i=0,j; char t; cin.getline(a,50,'\n'); for(i=0,j=strlen(a)-1;i(a)/2;i++,j--) { t=a[i]; a[i]=a[j]; a[j]=t; } cout; } //第二种 string str; cin>>str; str.replace; ...

    memmove、memcpy和memccpy简介.docx

    strcpy、memcpy、memmove 和 memset 四个函数都是用于字符串和内存操作的,但是它们之间有一些区别: * strcpy 函数用于字符串拷贝,但是它不知道拷贝的字节数目,它会一直拷贝直到遇到字符串结束符 '\0'。 * ...

    memcpy 函数.docx

    2. **安全复制**:与`strcpy`函数不同,`memcpy`需要提供要复制的字节数,这样可以避免因未指定长度而导致的缓冲区溢出问题。`strcpy`在遇到`\0`字符时停止复制,而`memcpy`则按指定的字节数复制。 3. **用途差异**...

    C,C++经典问题.docx

    C++中有三个内存操作函数:memset、memcpy、strcpy。memset函数用来 Setting所有内存空间为某个字符,memcpy函数用来拷贝内存空间,strcpy函数只能拷贝字符串。例如,char a[100]; memset(a, '\0', sizeof(a)); ...

    memset函数使用详解.pdf

    `strcpy` 函数则只能拷贝字符串,遇到 `\0` 就结束拷贝。 在使用 memset 函数时,需要注意避免内存溢出。例如,在使用 `memcpy` 函数时,如果目标内存空间不够大,可能会造成内存溢出。 memset 函数是一种非常有用...

    中兴面试问题总结

    5. memcpy、strcpy 和 memset 的区别 memcpy、strcpy 和 memset 是 C 语言中的三个常用的函数,用于字符串操作。 * memcpy 函数用于复制内存块,原型为:void *memcpy(void *dest, const void *src, size_t n); * ...

    memset函数的使用分析

    5. **与`memcpy`和`strcpy`的区别**: - `memcpy`:用于将一块内存区域的内容完整地复制到另一块内存区域,两者内存区域可以不相邻,但不能重叠。`memcpy`可以复制任意类型的数据,并指定复制的字节数。 - `strcpy...

    c++面试宝典c++面试宝典c++面试宝典c++面试宝典c++面试宝典

    **3.1 memcpy, memset, strcpy 的区别** - **`memset`**:用于将一段内存空间全部设置为某个特定字符。 - 示例:`char a[100]; memset(a, '\0', sizeof(a));` - **`memcpy`**:用于将源地址的内存复制到目标地址的...

    memset()函数[参照].pdf

    2. **过度使用**:在内存马上要被覆盖的情况下,如`strcpy()`或`memcpy()`之前,使用`memset()`是没有必要的,因为后续的操作会覆盖掉之前设置的值。 3. **错误地使用`memset()`于指针**:`memset()`通常用于基本...

Global site tag (gtag.js) - Google Analytics