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。 所以并不能用。

  • 相关阅读:
    HDU 1863 畅通工程(Kruskal)
    HDU 1879 继续畅通工程(Kruskra)
    HDU 1102 Constructing Roads(Kruskal)
    POJ 3150 Cellular Automaton(矩阵快速幂)
    POJ 3070 Fibonacci(矩阵快速幂)
    ZOJ 1648 Circuit Board(计算几何)
    ZOJ 3498 Javabeans
    ZOJ 3490 String Successor(模拟)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
  • 原文地址:https://www.cnblogs.com/jiading/p/11105366.html
Copyright © 2011-2022 走看看