memset 订阅
memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。 展开全文
memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
信息
头文件
string.h
函    数
void *memset
应用学科
计算机
别    名
初始化函数
适用领域
C/C++
中文名
memset函数
原    型
(void *s,int ch,size_t n);
外文名
memset
表达式
memset(void *s,int ch,size_t n);
memset函数介绍
void *memset(void *s, int ch, size_t n);函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 [1]  。memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度.
收起全文
精华内容
下载资源
问答
  • memset

    万次阅读 多人点赞 2019-09-10 09:33:07
    memset memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。 函数介绍 #include<string.h> void *memset(void *s, int ch, size...

    memset

    memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。

    函数介绍

    #include<string.h>
    void *memset(void *s, int ch, size_t n);
    

    memset解释:将s中当前位置后面的n个字节用ch替换并返回s。

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

    memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度。

    函数作用

    1,memset() 函数常用于内存空间初始化。

    2,memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化

    例如:memset(a,’\0’,sizeof(a));

    3,memset可以方便的清空一个结构类型的变量或数组。

    如:

    struct sample_struct
    {
        char csName[16];
        int iSeq;
        int iType;
    };
    

    对于变量

    struct sample_strcut stTest;
    

    一般情况下,清空stTest的方法:

    stTest.csName[0]={'\0'};
    stTest.iSeq=0;
    stTest.iType=0;
    

    用memset就非常方便:

    memset(&stTest,0,sizeof(sample_struct));
    

    如果是数组:

    struct sample_struct TEST[10];
    

    memset(TEST,0,sizeof(struct sample_struct)*10);
    

    此外:如果结构体中有数组的话还是需要对数组单独进行初始化处理的。

    展开全文
  • C++ memset 踩坑

    万次阅读 多人点赞 2020-12-25 12:12:54
    memset 的坑点总结

    一、前言

    memset 作为对内存初始化的函数,还是有不少坑和误区的,今天就来对这个函数作一个总结。

    二、函数作用

    • 最简单的调用就是将一个数组清零,代码如下:
    const int maxn = 1024;
    int a[maxn];
    memset(a, 0, sizeof(a));  // a[0]=a[1]=a[...]=0;
    
    • 这里 sizeof(a) = maxn * 4 = 4096;
    • 表示的是将 数组首地址 a 开始往后的 4096 个字节,都设置为 0

    三、效率对比

    • 直接调用 memset 接口清零 和 调用循环进行清零,进行一个测试后如下:

    对长度为 10000000 的数组,执行100次调用;

    模式 memset for
    debug 375ms 2156ms
    release 343ms 329ms
    • 因为 release 版本会做各种优化,编译器发现重复执行无效逻辑就会跳过,所以不太好造数据测试,研究时间效率的时候还是参考 debug 版本(当然,软件发布的时候肯定用的是 release 版本)。
    • memset 无论从时间效率,还是代码整洁来看都是由于 for 循环的,当然也带来了一些容易引起误解的地方。

    四、误区总结

    1、按字节设置

    • memset 实现原理是根据字节来设置的,比如对于字节数组char a[100],将所有字节都设置为5,就可以调用:
    	memset(a, 5, sizeof(a));
    
    • 但是,对于int b[100],也采用这种方法,就会导致错误:
    	memset(b, 5, sizeof(b));
    
    • 得到 b 数组中元素的值为 84215045;
    • 为什么呢?
    • 我们把这个数组转换成二进制,得到:
      (00000101 00000101 00000101 00000101)2(00000101 \ 0000 0101 \ 0000 0101 \ 0000 0101)_2
    • 因为 intint 占据了 44 个字节,把每个字节都设置成了5,所以最后转成十进制就变成了 84215045;
    • 同理,当类型是 short(二字节整数),或者 long long(八字节整数)都会有类似问题,总结表格如下:
    memset值 char short int long long
    0 0 0 0 0
    -1 -1 -1 -1 -1
    5 5 1285 84215045 361700864190383365
    • 表格中,只有0 和 -1是正常的,因为 0 的二进制表示中,所有位都为0;-1 的二进制表示中,所有位都为 1;
    • 特别的,当需要设置的数,对应类型的每个字节都是同一个数的时候,也可以采用 memset,比如:int 类型的 252645135(十六进制表示为:0x0f0f0f0f);

    2、设置的值只有最低字节有效

    memset(a, 0x05ffffff, sizeof(a));
    memset(a, 0xffffff05, sizeof(a));
    memset(a, 0xffffff08, sizeof(a));
    memset(a, 0x12345678, sizeof(a));
    
    • 设置值的时候,只会采用最低的字节作为赋值用,通俗的讲,就是以上四句话调用,等价于:
    memset(a, 0xff, sizeof(a));
    memset(a, 0x05, sizeof(a));
    memset(a, 0x08, sizeof(a));
    memset(a, 0x78, sizeof(a));
    

    3、堆内存不可直接 sizeof 取首地址

    • 在堆上申请了一个数组空间,并且想要给它初始化,调用如下:
    const int maxn = 1024;
    int *p = new [maxn];
    memset(p, 0, sizeof(p));
    
    • 这里进入了另一个误区,因为 pp 在这里虽然是数组首地址,但是它扮演的角色更多的,其实是个指针,所以在进行 sizeof 运算符操作的时候,取得的值并不是 4096,而是指针的大小;
    • 32位机子上,指针大小为4,;64位机子上,指针大小为 8;
    • 正确做法是:
    const int maxn = 1024;
    int *p = new [maxn];
    memset(p, 0, maxn * sizeof(int));
    

    4、传参数组不可直接 sizeof 取首地址

    • 对传参为数组的数据进行 memset,调用如下:
    void fun(int a[maxn]) {
        memset(a, 0, sizeof(a));
    }
    
    • 这里调用同样是错误的,因为当数组作为传参的时候,这里的 a 已经退化为指针,所以同样不能用 sizeof 数组首地址来取大小;
    • 正确做法是:
    void fun(int a[maxn]) {
        memset(a, 0, maxn * sizeof(int));
    }
    
    • 当然,当传参是结构体指针的时候也是如此;
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,849
精华内容 11,139
热门标签
关键字:

memset