关闭

linux中memset的正确用法

492人阅读 评论(0) 收藏 举报
分类:

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等类型数组!

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:317574次
    • 积分:4994
    • 等级:
    • 排名:第5601名
    • 原创:162篇
    • 转载:172篇
    • 译文:1篇
    • 评论:24条
    交流分享
    欢迎大家加入QQ群:469897460 一起来分享交流技术
    最新评论