memcpy与memset

一,strcpy()

char *strcpy(char *dest, const char *src){
  if ((src == NULL) || (dest == NULL)){
        return NULL;
    }
  char *temp = dest;
  while (*strSrc != '\0'){
        *strDest ++ = *strSrc ++;
    }
  return temp;
}


二,memcpy()

void *memcpy(void *dest,const void *src, size_t count){
    if(dest == NULL || src == NULL){
        return NULL;
    }
    char *pDest = static_cast<char*>(dest);
    const char *pSrc = static_cast<const char*>(src);
    int i = 0;
    while (i < count){
        *pDest ++ = *pSrc ++;
        i ++;
    }
    return dest;
}


三,strcpy与memcpy之间的区别
(1)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型数组等。
(2)复制的方法不同。strcpy不需要指定长度,它遇到串结束符"\0"就结束,所以容易溢出,例如:dest的长度为5,而src的长度为10,复制的时间dest就会溢出,也就是dest越界了。memcpy则是根据其第3个参数决定复制的长度。
(3)用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。


四,memset()

函数声明:

void *memset(void *s, char ch, unsigned n)

函数用法:

将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,并且通常初始化为0或者字符'\0'。

应用举例:

struct Student{
    int age;
    string name;
};

int main(){
    //对字符数组进行初始化
    char str[20];
    memset(str, '\0', sizeof(str));

    //对整数数组进行初始化
    int nums[20];
    memset(nums, 0, sizeof(nums) * sizeof(int));

    //对结构体进行初始化
    Student zhangsan;
    memset(&zhangsan, 0, sizeof(Student));
    return 0;
}

注意:

(1)memset的第一个参数已经有了被初始化空间的首地址,为什么还要返回一个void*的指针去指向这个地址呢?这种结构在很多函数库里面比较常见,这里之所以还要返回这个指针是为了实现链式编程

(2)一定要注意,memset是按照字节对空间进行初始化的,也就是说,函数里面的第二个参数的那个初值(一般为0)是按照一个一个字节往第一个参数所指区域赋值的,所以,对于单字节数据类型(char)可以初始化为任意支持的值,但是对于非多字节数据类型只能初始化为0,而不能初始化成别的初值


五,自定义memset函数

void *memset(void *s, char ch, unsigned n){
    if(s == NULL){
        return NULL;
    }
    char *str = (char*)(s);
    int length = sizeof(str);
    int minValue = length > n ? n : length;
    int i = 0;
    while(i < minValue){
        *str ++ = ch;
        i ++;
    }
    return s;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值