1.memset

原型:   extern void *memset(void *buffer, int c, int count);

功能:   把buffer所指内存区域的前count个字节设置成字符 c。注意,memset始终按字节赋值,           

     说明: 返回指向buffer的指针。用来对一段内存空间全部设置为某个字符, memset可以方便的清空一个结构类型的变量或数组。   

     使用

          char a[10];int b[10];
memset(a, '\0', sizeof(a));
memset(b,0,sizeof(int)*10);
struct _test{ char s[10];int x;int y; };
struct _test st,st1[10];
memset(&st,0,sizeof(struct _test)); //很方便的清空结构体
memset(st,0,sizeof(struct _test)*10);

2.memcpy

原型:extern void *memcpy(void*dest,void*src,unsignedintcount); 
          

     功能: 由src所指内存区域复制count个字节到dest所指内存区域。始终按字节拷贝,不判断目标是否有足够的大小。             

     说明: src和dest所指内存区域不能重叠,函数返回指向dest的指针.可以拿它拷贝任何数据类型的对象。

使用

char a[10],b[5];
memcpy(b, a, sizeof(b)); /将a拷贝给b,*注意如果用sizeof(a),会造成b的内存地址溢出*/

3.strcpy

原型: extern char *strcpy(char *dest,char *src);

功能: 把src所指由NULL结束的字符串复制到dest所指的数组中。 注意,结束符号本身已经拷贝。              

       说明: src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳 src的字符串.返回指向dest的指针。                    

       使用

char a[100],b[50];
strcpy(a,b);//要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

定义

char   *strcpy(char   *strDest,const   char   *strSrc)
{
assert((strDest!=NULL)&&(strSrc !=NULL)) //判断指针是否合法,即分配内存,指向某块确定区域
char *address strDest; //记住目标地址的起始值
while((*strDest++=*strSrc++)!='\0') //先拷贝,后判断,这样就不用在拷贝完了后,再加一句
NULL; // *strDest = '\0'; -->即加一个结束符.因为字符串结束已拷贝了.
return address; //返回目标首地址的值。
}

可以看到,并不判断目标是否有足够大小。错误的使用如下:

int main(){
char s[]="123456789";
char d[]="1234"
strcpy(d,s);
cout<<d<<s<<endl;
}

输出为1234567896789。由于s,d的内存连续。故拷贝后结果为123456789/06789/0。此时访问了不可预知的地址。

strcpy和mempy的代码如下:

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;
}
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;
}

4.三者区别 

memset   主要应用是初始化某个内存空间。用来对一段内存空间全部设置为某个字符,一般用于在对定义的字符串初始化为'\0'                

           memcpy   是用于copy源空间的数据到目的空间中。是用来做内存拷贝,可以用来拷贝任何数据类型的对象,可以指定拷贝的数据长度。

           strcpy   用于字符串copy,遇到‘\0’,赋值完结束符即结束。但是注意,'\0'已经被拷贝。

例子:

	char str1[]="123456789";
char str2[]="123456789"; memcpy(str1,str1+2,strlen(str1+2));
strcpy(str2,str2+2);

str1="345678989";

str2="3456789";

memset,memcpy,strcpy的使用与区别的更多相关文章

  1. C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码

    extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h>   功能:由src所指内存 ...

  2. memset,memcpy,strcpy

    http://www.cppblog.com/junfeng568/archive/2006/03/11/4022.html

  3. memcpy、memmove、memset及strcpy函数实现和理解

    memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...

  4. 逆向 string.h 函数库 memset、strcpy、strcmp 函数

    memset 函数 函数原型:void *memset(void *str, int c, size_t n) 主要功能:复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符 ...

  5. C++:memset ,memcpy 和strcpy 的根本区别!

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h&g ...

  6. memset memcpy函数

    memset 函数 1.其头文件为: #include<memory> 或者#include<string> 2.原型    看清是对每个字节,不是其类型 void *mems ...

  7. memset,memcpy,memcmp用法

    void* memset(void *s, int ch, size_t n); 将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值. 例如:memset(lpMyStruct ...

  8. strcpy, mencpy, memmove三者区别

    首先来看strcpy,目的是实现字符串的复制,这里需要注意几个点: 1.判断指针的有效性 2.将复制后的指针地址返回,为了支持链式操作 3.不要忘记将字符串最后一个自负'\0'复制给dest 4.注意 ...

  9. memset memcpy

    memset与memcpy的用法: void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 cmemset可以方便的清空一个 ...

随机推荐

  1. spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)

    Spring提供的JDBC框架负责管理资源和异常处理,从而可以简化开发者的JDBC代码.开发者只需要编写写入和读取数据库相关的代码即可. 正如在之前的小节中论述过的,Spring将数据库访问过程中的模 ...

  2. java:file文件类

    public class FileDemo { public static File file; public static void main(String args[]) { String s = ...

  3. 通过Intent 打开系统级应用

    众所周知,各个手机厂商由于对Android 原生系统定制的原因,会造成系统级应用packname 和activityname 不同的现象,就拿时钟软件来说,魅族2的activityname 是[com ...

  4. jquery清空form表单

    //在form表单中添加一个隐藏的reset按钮, <button type="reset" style="display:none;"></ ...

  5. 微信浏览器HTTP_USER_AGENT判断

    微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 微信浏览器 HTTP_USER_AGENT作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/archiv ...

  6. A*B problem(FFT)

    #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...

  7. BEC translation exercise 4

    People have long known that nuts are part of a healthy diet.人们早就知道坚果是健康饮食的一部分.People, who you know w ...

  8. ios开发小技巧(转)

    1.通过下面方式可以获取图片的像素颜色点:- (void*)getImageData:(UIImage*)image{    void* imageData;    if (imageData == ...

  9. CCTextFieldTTF 与 5种常用CCMenuItem

    //继承(class HelloWorld : public cocos2d::CCLayer, public cocos2d::CCTextFieldDelegate) CCTextFieldTTF ...

  10. mac下安装libpng环境

    用go写一个爬虫工具时需要使用一个go的库,而这个库有需要使用libpng库,不然编译就会提示说 png.h找不到等之类的信息,于是想到应该和windows一样需要安装gcc环境,然后让gcc里安装l ...