memcpy与memset

来源:互联网 发布:nba2konline作弊软件 编辑:程序博客网 时间:2024/05/29 07:48

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

原创粉丝点击