• memset


    将s所指向的某一块内存中的每个字节(八位二进制数)的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针


    void *memset(void *s,int ch,size_t n);
    函数解释:将 s 中前 n 个字节用 ch 替换并返回 s 。
    memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。



    常见错误:
    1.
    其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现
    int some_func(struct something *a){


    memset(a,0,sizeof(a));

    }
    这里错误的原因是VC函数传参过程中的指针降级,导致sizeof(a),返回的是一个 something* 指针类型大小的的字节数,如果是32位,就是4字节。



    2.
    特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)

    3.
    如下程序想把数组中的元素值设置成1,却是不可行的
    #include <iostream>
    #include <cstring>
    using namespace std;
    int main()
    {
    int a[5];
    memset(a,1,5);//如果这里改成memset(a,1,5 *sizeof(int))也不可以,因为memset按字节赋值。
    for(int i = 0;i < 5;i++)
    cout<<a[i]<<" ";
    system("pause");
    return 0;
    }

    答:
    ⒈因为第一个程序的 数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用 memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样?
    ⒉如果用memset(a,1,20);(实际上与memset(a,1,5*sizeof(int))结果是一样的)
    就是对a指向的内存的20个字节进行赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4 字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了




  • 相关阅读:
    IDEA常用快捷指令整理
    Python dict 字典
    内联函数
    【MFC】编辑框 CEdit Ctrl控件自动换行设置
    mysql 多sql文件恢复方案
    Linux: 用64位的系统,能编译32位的程序吗?
    C++ 遍历数组
    工业现场传感器传感器为什么采用电流形式输出?
    【转】电磁阀、电磁铁的工作原理说明
    PCB板强弱电隔离距离不够导致损坏和问题检查记录
  • 原文地址:https://www.cnblogs.com/wwjyt/p/3153119.html
Copyright © 2020-2023  润新知