使用memset初始化数组

使用memset初始化数组写在前面的ATTENTION:用memset初始化非char型(eg.int型、float型…)数组时,假如初始化值非0,可能导致错误的结果。先举个通常用法的栗子,将int型数组arr的元素初始化为0:intarr[5];memset(arr,0,sizeof(int)*5);假如初始值不为0,会如何呢?例如设置为1:使用memset(arr,1,sizeof(int…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

写在前面的ATTENTION:用memset初始化非char型(eg. int型、float型…)数组时,假如初始化值非0,可能导致错误的结果。

先举个通常用法的栗子, 将int型数组arr的元素初始化为0:

int arr[5];
memset(arr, 0, sizeof(int) * 5);

假如初始值不为0,会如何呢?例如设置为1:
使用memset(arr, 1, sizeof(int) * 5),得到的arr元素值为:0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101,显然并非所期望的结果。
再来回头看看memset的基础知识吧:

memset
void * memset ( void * ptr, int value, size_t num );
Fill block of memory
Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).
Parameters
ptr Pointer to the block of memory to fill.
value Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.
num Number of bytes to be set to the value.size_t is an unsigned integral type.
Return Value
ptr is returned.

注意到,memset填充内存时,是以byte为单位的,而上面例子中的int型数组每个元素就占了4bytes,故而填充后的值就是0x01010101了。
此外,memset的参数value,虽然是int型,但是会将其转换为unsigned char再进行填充,这样才能跟byte对应上。如果设置的value超过了unsigned char的表示范围,就溢出了,例如这样memset(arr, 256, sizeof(int) * 5),得到的结果反而与memset(arr, 0, sizeof(int) * 5)相同。
对于int型数组,假如初始化值为-1,也是可以用memset的,这种情况下得到的值是0xffffffff。但是对于其他类型例如float型数组,就不能这样做了。

BTW,如果使用int arr[5] = {1},只会将数组中的第一个元素初始化为1,其他元素则是默认值。int变量的默认值,假如是全局变量或静态局部变量则为0,假如是局部变量则为随机值(C语言规范中未作要求)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179428.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jediscluster api_java.lang.throwable

    jediscluster api_java.lang.throwable由于redis的集群rediscluster不支持keys这样的多key操作(具体原因由于sharding后,不同的key属于不同的slot,难以支持原子操作)。所以如果一个对外需要对缓存做失效处理时比较棘手。所以本类提供工具方法再rediscluster查找按照hashTags处理的keys和一般的keys。基于jediscluster实现。有优化空间,现在懒得改了importjav…

    2022年10月14日
    2
  • POJ–1300–Door Man【推断无向图欧拉通路】

    POJ–1300–Door Man【推断无向图欧拉通路】

    2022年1月26日
    82
  • CentOS 6.5 & CentOS 7 rpm安装ftp服务端与ftp客户端「建议收藏」

    CentOS 6.5 & CentOS 7 rpm安装ftp服务端与ftp客户端「建议收藏」一、rpm安装ftp服务端1、查看是否安装vsftprpm-qa|grepvsftpd如果出现vsftpd,说明已经安装vsftp2、下载vsftpd:我这里下载的是vsftpd-2.2.2-24.el6.x86_64.rpm3、安装vsftpdrpm-ivhvsftpd-2.2.2-24.el6.x86_64.rpm4、测试是否安装成功servicevsftp…

    2022年10月21日
    1
  • 支付风控模型

    支付风控模型支付风控数据仓库建设 。支付风控涉及到多方面的内容,包括反洗钱、反欺诈、客户风险等级分类管理等。其中最核心的功能在于对实时交易进行风险评估,或者说是欺诈检测。如果这个交易的风险太高,则会执行拦截。由于反欺诈检测是在交易时实时进行的,在要求不能误拦截的同时,还有用户体验上的要求,即不能占用太多时间,一般要求风控操作必须控制在100ms以内,对于交易量大的业务,10ms甚至更低的性能要求都是必须的。

    2022年4月29日
    87
  • mysql删除表数据及其关联数据_MYSQL中delete删除多表数据与删除关联数据

    mysql删除表数据及其关联数据_MYSQL中delete删除多表数据与删除关联数据在mysql中删除数据方法有很多种,最常用的是使用delete来删除记录,下面我来介绍delete删除单条记录与删除多表关联数据的一些简单实例。1、deletefromt1where条件2、deletet1fromt1where条件3、deletet1fromt1,t2where条件4、deletet1,t2fromt1,t2where条件前3者是可行的,第…

    2022年7月17日
    20
  • 以太网PHY层芯片LAN8720A简介

    以太网PHY层芯片LAN8720A简介1、LAN8720A简介2、芯片管脚配置3、硬件电路

    2022年6月16日
    92

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号