zoukankan      html  css  js  c++  java
  • 使用memset初始化int数组

    memset()是一个来自于string库的函数,正规用法是初始化char类型的数组。因为char类型只占1个字节,memset按字节赋值后,会将char类型数组的所有元素变为你指定的值。但是4字节的int类型在被memset赋值后,会被重复四次:如使用memset赋值1到int数组后,1转为二进制的一个字节为00000001,赋值完成后为00000001000000010000000100000001,即十进制的16843009。因此不能直接对int数组memset赋值目标值。也因此,将数组赋值为0可以正常使用

    还有一个应用是,对一个int数组使用memset( , 0xff, sizeof());时,赋值完成后每个元素为11111111111111111111111111111111,即-1。

    除了赋值0或-1外,有时也需要将数组初始化为极大值。下面是几个常用的赋值。

    memset(arr, 0x7f, sizeof(arr)); //set int to 2139062143
    memset(arr, 0x80, sizeof(arr)); //set int to -2139062144
    memset(arr, 0x7f, sizeof(arr)); //set double to 1.38242e+306
    memset(arr, 0xfe, sizeof(arr)); //set double to -5.31401e+303

    注意,由于上面的赋值接近了数据类型的上限,在极大值相加(如最短路算法有时会出现)时会出现溢出

    这里推荐一个比较合适的常量:0x3f3f3f3f,转换为十进制仍达到1061109567,为109级别,正常情况下不会小于正常常数值。而0x3f3f3f3f * 2 = 2122219134‬,仍没有超过int类型的上限232。而且,由于0x3f3f3f3f的每个字节均相同,在memset时直接使用

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

    即可完成最短路算法中常用的极大值初始化。

  • 相关阅读:
    CentOS7安装MySql5.7
    环境变量配置
    Spring 注解
    MySQL
    常用命令
    Android Studio & IntelliJ IDEA常见问题与设置
    order by、group by、having的区别
    把WebStrom添加到右键菜单
    解决github访问速度慢的问题
    docker修改时区
  • 原文地址:https://www.cnblogs.com/miserweyte/p/11461574.html
Copyright © 2011-2022 走看看