zoukankan      html  css  js  c++  java
  • memset 与 memcpy

    1. memset

    需要的头文件 在C中 <string.h>

    在C++中 <cstring>

    原型:

    void *memset(void *s, int ch, size_t n);

    用法:

    memset是计算机中C/C++语言函数。将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ascii值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。

    函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

    memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

    以我们一开始提出的问题为例:

    复制代码
    #include<string.h>
    
    int main(void)
    {
        int a[5] = {1, 2, 3, 4, 5};
        memset(a, 0, sizeof(a));
    }
    复制代码

    就这样就成功清零了,是不是很方便。

    注意:

    如果是字符数组的话,memset可以随便用,但是如果是其他类型的数组,一般只用来清零,如果是填充数据就不合适了,如:

    memset(a, 1, sizeof(a));

    想用这个来把a所有元素设置为1,是不成功的,为什么呢?

    因为memset函数每次填充的数据长度为一个字节,即为0x01,而a的一个元素长度为4个字节,即0x00000000,如果把0x01填充进去,则填充的结果是0x01010101,而不是我们期待的0x00000001,所以是不合适的,但是用来清零真是一级棒!

    2. memcpy

     
    所需头文件
    #include <string.h>
     

    原型:

    void *memcpy(void *dest, const void *src, size_t n);

    用法:

    memcpy函数是内存拷贝函数,功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

    因为这个函数是直接操作内存的。

    例子1:

    复制代码
     1 #include<string.h>
     2 
     3 int main(void)
     4 {
     5     int a[5] = {1, 2, 3, 4, 5}, b[5];
     6     /*第一个参数是要保存的位置的起始地址,所以我们直接放b
     7      *第二个参数是源数据的起始地址,所以我们把a放上去
     8      *第三个参数是要复制的内存块的长度,为a的长度sizeof(a)*/
    10     memcpy(b, a, sizeof(a));
    11 }
    复制代码

    就这样一行的代码,就能代替我们之前的for循环,是不是简洁高效了许多。这个函数的作用不仅仅是这样,它还可以用与两个字符串的复制,内存块的复制等,各种数据类型都能复制。

    例子2:

    #include <stdio.h>
    #include <string.h>
    
    #define BUF1 ("Hello world!")
    #define BUF2 ("My name is snail!")
    
    int main()
    {
    	char str[512];
    	memset(str, 0, 512);
    	memcpy(str, BUF1, strlen(BUF1));
    	
    	printf("str = %s
    ", str);	
    	memcpy(str + strlen(BUF1), BUF2, strlen(BUF2));	
    	printf("str = %s
    ", str);
    	
    	return 0;	
    }
    

    PS:

    memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;

    例:char a[100],b[50];

         memcpy(b, a, sizeof(b));

         //注意如用sizeof(a),会造成b的内存地址溢出。 


    strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝;

    例:char a[100],b[50];

           strcpy(a,b);

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

     

    参考: http://www.cnblogs.com/king-ding/p/memset_mencpy.html

             http://blog.csdn.net/yf210yf/article/details/9074821

  • 相关阅读:
    Ubuntu 永久修改DNS
    三大主流MQ的组织结构
    nginx基本配置
    CentOS7安装RabbitMQ
    单个表上亿行数据的主键、索引设计,及分页查询
    [SQL]行列转换
    《团队协作的五大障碍》读后感
    【2021-09-26】面对困难是未来绝不后悔的事情
    【2021-09-25】摇摆不定反逼自己脚踏实地
    【一句日历】2021年10月
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/6947355.html
Copyright © 2011-2022 走看看