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));

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

  • 相关阅读:
    linux中编译C语言程序
    plsql 基础教程(二)
    plsql 基础教程(一)
    plsql开发笔记和小结
    表的约束
    一道面试题:说说进程和线程的区别
    HashTable实现原理
    HashMap、Hashtable、HashSet三种hash集合的区别
    Eclipse快捷键大全
    Statement、 PreparedStatement 、CallableStatement 区别和联系
  • 原文地址:https://www.cnblogs.com/miserweyte/p/11461574.html
Copyright © 2011-2022 走看看