zoukankan      html  css  js  c++  java
  • 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元素的赋值了




  • 相关阅读:
    jmeter压力测试报错:java.net.BindException: Address already in use: connect
    C# 对话框总结(转载)
    C# 文件操作方法大全(转载)
    C#实现进度条progress control(转载)
    在Windows下架设FTP服务器
    .Net环境下,使用installutil.exe注册、删除windows服务
    用双网卡实现跨网段访问(转载)
    HTTP协议详解(转载)
    学习开发web服务(转载)
    C# 实现http协议的GET和POST请求(转载)
  • 原文地址:https://www.cnblogs.com/wwjyt/p/3153119.html
Copyright © 2011-2022 走看看