linux中memset的正确用法

原创 2013年12月02日 09:09:49

linux中memset的正确用法

      【起因】希望对各种类型的数组进行初始化,避免野值

      【函数头文件】 疑问提示:在linux中可以在terminal中输入 "man memset"进行查询

        #include
        void *memset(void *s, int c, size_t n);

      【使用说明】 The  memset()  function  fills  the  first  n  bytes of the memory area  pointed to by s with the constant byte c.
      【错误用法】
        int array[10];
        memset(array,1,10);//或者memset(array,1,sizeof(array)),都是不对的!

      【解释】
       之前一直不明白为什么memset这个函数的头文件是 "string.h",看完下面的内容,你就会明白了。

       memset函数使用说明中提到的是按照byte来填充。

       举例来说
       char arr[10]; memset(arr,'a',10);
       由于char只占一个字节(byte),因此函数的结果是将连续的10个字节都填充为'a'。这是我们所期待的结果!

       int arr[10];memset(arr,1,10);
       由于int占4个字节(byte),因此"1"对应的二进制(32bits下)为"00000000000000000000000000000001"(4bytes),塞到1byte(8bit)的中,高位被舍弃了。所以,填入数组中的值是"00000001"。然而总共有10*4=40个byte,却只有10个byte被填充,因此结果是"00000001……00000001**********"(前面总共10个"00000001")。因此,第一个数是"0x01010101"=16843009(10进制)数组其余部分的值则是随机值,读取出来会是很离谱的数!
       有人说,可以这样memset(arr,1,sizeof(arr));
       其实这样做,就是将数组的所有值都填充为"0x01010101",也就是int数组的初始值变为了16843009
 !这确实有点出乎我们的预料!

  正确用法】
   方法一:可以用任何值来初始化char数组!比如 memset(arr,'a',10);
   方法二:可以用"0"来初始化任何类型数组!比如 memset(arr,0,sizeof(arr));//arr可以是char或int等类型数组!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux中memset的正确用法

【起因】希望对各种类型的数组进行初始化,避免野值       【函数头文件】 提示:在linux中可以在terminal中输入 "man memset"进行查询         #incl...
  • ufo714
  • ufo714
  • 2013年01月17日 15:29
  • 6415

linux中memset的正确用法

【起因】希望对各种类型的数组进行初始化,避免野值       【函数头文件】 提示:在linux中可以在terminal中输入 "man memset"进行查询         #incl...

linux中memset的正确用法

【起因】希望对各种类型的数组进行初始化,避免野值      【函数头文件】 提示:在linux中可以在terminal中输入 "man memset"进行查询        #include     ...
  • whuslei
  • whuslei
  • 2011年07月14日 19:51
  • 18219

linux cksum命令参数及用法详解---检查文件的CRC是否正确

语法:cksum [--help|--version] [file..] 说明:      cksum命令是确保文件从一个系统传输到另一个系统地过程中没有被损坏。这个测试要求校验和在源系统中...

C++-正确使用memset

前段项目中发现一个问题,程序总是在某个dynamic_cast进行动态转换时出异常,查了半天才发现问题原来是出在memset的使用上,虽然问题本身显而易见,但当处于几十万行代码量级中时,就变得不太那么...
  • ko_tin
  • ko_tin
  • 2016年10月27日 16:30
  • 133

老生常谈,正确使用memset

前段项目中发现一个问题,程序总是在某个dynamic_cast进行动态转换时出异常,查了半天才发现问题原来是出在memset的使用上,虽然问题本身显而易见,但当处于几十万行代码量级中时,就变得不太那么...

老生常谈,正确使用memset

前段项目中发现一个问题,程序总是在某个dynamic_cast进行动态转换时出异常,查了半天才发现问题原来是出在memset的使用上,虽然问题本身显而易见,但当处于几十万行代码量级中时,就变得不太那么...

转记 memset的正确用法

FROM:http://www.cnblogs.com/whusl/archive/2011/07/14/2345790.html       【起因】希望对各种类型的数组进行初...

memmove(),memcopy(),memset()对std::string的影响,以及它们在c/c++中正确的使用方法。

memmove(),memcopy(),memset()是c语言中非常常用的函数,具体功能这里不详细介绍。当它们对于c++标准库中的string进行操作时会产生什么影响呢?我们先来看一段程序。 // ...
  • D_Guco
  • D_Guco
  • 2016年12月02日 23:35
  • 527

C++中memset()函数的用法详解

头文件:cstring 或 memory 话说刚开始使用memset的时候一直以为memset是对每一个int赋值的,心里想有了memset还要for循环对数组进行初始化干嘛。但其实memset...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux中memset的正确用法
举报原因:
原因补充:

(最多只允许输入30个字)