使用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu安装五笔输入法「建议收藏」

    Ubuntu安装五笔输入法「建议收藏」学习Ubuntu 环境VirtualBox 准备好Ubuntu系统后,这里下载的是12.04LTS版本1.安装五笔输入法在网上找资料,通过Ibus平台安装五笔输入法发现本操作系统已安装了Ibus,然后直接安装五笔IBUS五笔:sudoapt-getinstallibus-table-wubi2.设置输入法ibus-setup

    2022年7月26日
    4
  • python初学入门教程_初学python编程入门教程「建议收藏」

    python初学入门教程_初学python编程入门教程「建议收藏」对于不同的编程语言来讲,各有各的特点,各有各的长处。python这个编程语言,有什么明显的好处呢?有经验的程序员甚至可能在一天之内就掌握Python的基础知识,至多不过一周作用就可以上手,而编程语言的专家则肯定会比他掌握C、C++、Java甚至Perl要快很多。Python因其语法的明晰而获得的最大好处或许该算是开发时间的大大降低了。由于它易学、易用,学习成本较低,写代码的效率较高,所以使用者很…

    2022年6月22日
    28
  • notepad++正则表达式替换字符串

    notepad++正则表达式替换字符串则表达式是一个查询的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以扩展查找字符串的能力,正则表达式在查找和替换字符串的作用不可忽视,它能很好提高工作效率。EditPlus的查找,替换,文件中查找支持以下的正则表达式:表达式说明/t制表符./n新行..匹配任意字符.|匹配表达式左边和右边的字符.例如,”ab|bc”匹配”ab”或者”bc”….

    2022年5月17日
    43
  • linux复制文件夹下的所有文件到另一个文件夹_shell复制文件内容到另一个文件

    linux复制文件夹下的所有文件到另一个文件夹_shell复制文件内容到另一个文件Linux系统cp的用法:cp用于复制文件或目录。参数说明:-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。-d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。-f:覆盖已经存在的目标文件而不给出提示。-i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答”y”时目标文件将被覆盖…

    2022年8月23日
    12
  • 通过reduce函数实现数组求和_js数组求和的方法

    通过reduce函数实现数组求和_js数组求和的方法对于实现数组求和,我们常用的思路是通过for、while,对数组进行迭代,依次将他们的值加起来,下面列举常用的两种方法第一种:vararr=[1,2,3,4,5,6];Array.prototype.sum=function(){varsumResult=0;for(vari=0;i<this.lengt…

    2022年10月2日
    1
  • Hadoop简介_hadoop百度百科

    Hadoop简介_hadoop百度百科Hadoop的架构在其核心,Hadoop主要有两个层次,即:加工/计算层(MapReduce)存储层(Hadoop分布式文件系统)除了上面提到的两个核心组件,Hadoop的框架还包括以下两个模块:Hadoop通用:这是Java库和其他Hadoop组件所需的实用工具HadoopYARN:这是作业调度和集群资源管理的框架HadoopStreaming是一个实用程…

    2022年10月17日
    2

发表回复

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

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