zoukankan      html  css  js  c++  java
  • 关于memset的几个易错点

    memset(void *s,int ch,size_t n);

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

    注意这里是“字节”而非单位长度,memset不会考虑各个类型的单位长度,只是处理字节。所以使用的时候应该用如下的格式:

    memset(a,b,n*sizeof(int));//这里以Int为例。

    -----------------------------------

    同样是这个问题,我在一次想要给一个二维数组赋初值INT_MAX,写了这样的语句:

    memset(mi,0x3f,sizeof(mi));

    但是得到的结果却一直是-1,这是因为忽略了memset只是给字节赋值而非给单位赋值!INT_MAX是int中的最大值,但Int是占用4个字节的!用Int的最大值给字节赋值显然不合适。

     常用的几个正确的memset初始化方案有:

    memset(mp,0,sizeof mp):  使mp数组里的所有值变为0x00000000 ,而0x00000000 = 0,所以mp数组里的所有值就变为了0。
    memset(mp,0x3f3f3f3f,sizeof mp):0x3f3f3f3f = 1061109567 为10^9。 而且使用这个数字直接用memset函数就行了,不用循环初始化数组,不然真的很烦。(不是Int的最大值,但也已经是一个比较大的数了,大多数情况下可以了)
    memset(mp,-1,sizeof mp):会使mp中每个元素的值为-1的原因如下:
    int类型的整数-1在32位的计算机中表示为 11111111    11111111   11111111   11111111
    memset将void *memset(void *s, int ch, size_t n)中的ch强制转换为unsigned char,
    也就是变成11111111
    最终执行完memset函数后,temp对应的内存每一字节都被赋值为11111111
    也就是说temp的任意一个元素都为11111111    11111111   11111111   11111111
    恰好为-1。

    ---------------------
    作者:Mr_Treeeee
    来源:CSDN
    原文:https://blog.csdn.net/Mr_Treeeee/article/details/70540307
    版权声明:本文为博主原创文章,转载请附上博文链接!

    同样的错误方案有:

    memset(mp,1,sizeof mp):  变量被初始化成了0x01010101 = 16843009 , 而非1。 所以并不能用。

  • 相关阅读:
    设计模式之策略模式
    设计模式之简单工厂模式
    UML 之关系
    C# delegate (001)
    转: 编写高质量代码改善C#程序的157个建议
    通过配置数据库邮件实现发送邮件
    存储过程学习(004)--象写程序一样的写存储过程及调试
    存储过程学习(003)--象写程序一样的写存储过程及调试
    存储过程学习(002)--循环插入数据
    jQ新的事件绑定方法on()
  • 原文地址:https://www.cnblogs.com/jiading/p/11105366.html
Copyright © 2011-2022 走看看