memset函数的作用和用法

1。void *memset(void *s,int c,size_t n)

总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c

memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a));


1. memset是以字节为单位,初始化内存块。
当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,


char data[10];  
    memset(data, 1, sizeof(data));    // right  
    memset(data, 0, sizeof(data));    // right

而在初始化其他基础类型时,则需要注意,比如,

  1. int data[10];  
  2. memset(data, 0, sizeof(data));    // right  
  3. memset(data, -1, sizeof(data));    // right  
  4. memset(data, 1, sizeof(data));    // wrong, data[x] would be 0x0101 instead of 1
2. 当结构体类型中包含指针时,在使用memset初始化时需要小心。
比如如下代码中,

  1. struct Parameters {  
  2.           int x;  
  3.           int* p_x;  
  4. };  
  5. Parameters par;  
  6. par.p_x = new int[10];  
  7. memset(&par, 0, sizeof(par))  



  1. 当memset初始化时,并不会初始化p_x指向的int数组单元的值,而会把已经分配过内存的p_x指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,显而易见也是不应该使用memset来初始化的。

    3. 当结构体或类的本身或其基类中存在虚函数时,也需要谨慎使用memset。
    这个问题就是在开头项目中发现的问题,如下代码中,
  2. class BaseParameters  
    {  
    public:  
        virtual void reset() {}  
    };  
     
    class MyParameters : public BaseParameters  
    {  
    public:   
        int data[3];  
        int buf[3];  
    };  
     
    MyParameters my_pars;  
    memset(&my_pars, 0, sizeof(my_pars));  
    BaseParameters* pars = &my_pars;  
     
    //......  
     
    MyParameters* my = dynamic_cast<MyParameters*>(pars);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值