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

  • 相关阅读:
    LeetCode 123. Best Time to Buy and Sell Stock III (stock problem)
    精帖转载(关于stock problem)
    LeetCode 122. Best Time to Buy and Sell Stock II (stock problem)
    LeetCode 121. Best Time to Buy and Sell Stock (stock problem)
    LeetCode 120. Triangle
    基于docker 搭建Elasticsearch5.6.4 分布式集群
    从零开始构建一个centos+jdk7+tomcat7的docker镜像文件
    Harbor实现容器镜像仓库的管理和运维
    docker中制作自己的JDK+tomcat镜像
    docker镜像制作---jdk7+tomcat7基础镜像
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/6947355.html
Copyright © 2011-2022 走看看