linux中memset的正确用法

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

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

        #include<string.h>
        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等类型数组!

  【小结】版权所有,如有转载请注明出处:blog.csdn.net/whuslei
   不难看出为什么memset在"string.h"头文件中声明了,因为他是以byte为单位来处理的,而char正好是一个byte!
   用"0"来初始化数组时,要初始化的长度最好用sizeof(arr)来计算,这样避免出错!是不是很强大?
   当然,并非任何时候都需要初始化!详情请参考http://www.cublog.cn/u1/49221/showart_422256.html

Linux,如果使用memset函数时发生崩溃,可能有多种原因导致。根据提供的引用内容,我可以提供以下分析方法: 1. 查看程序日志或错误信息:使用gdb或其他调试工具运行程序,查看是否有相关的错误信息或崩溃提示。这可以帮助确定崩溃的具体原因。 2. 检查内存访问错误:memset函数是用来设置内存块的值,在使用memset函数时,需要确保传入的参数正确且有效。如果传入的参数存在问题,比如指针为空或指针越界等,就有可能导致崩溃。可以通过检查参数的合法性和程序的内存访问方式来解决这个问题。 3. 考虑内存对齐问题:在ARM平台上,结构内存对齐问题可能导致崩溃。如果使用memset函数对结构进行操作,需要确保结构在内存按照正确的对齐方式分配空间。可以通过查看汇编代码和对代码进行对齐检查来解决这个问题。 4. 查找第三方库的问题:如果程序依赖于第三方库,而该库本身存在问题或与操作系统不兼容,也可能导致崩溃。在这种情况下,可以尝试更新库版本或者与库的开发者进行联系,以获取解决方案。 需要注意的是,以上方法仅提供了一些常见的解决思路,具体的分析和解决方法可能需要根据具体的情况来确定。同时,建议在编写代码时,仔细检查参数和内存访问方式,以避免出现崩溃问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux程序崩溃分析(一)](https://blog.csdn.net/Stone831143/article/details/120847985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [linux进程监控和进程守护程序](https://download.csdn.net/download/netpbc/13059960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Linux C/C++ 对于SIGBUS、SIGSEGV等崩溃异常捕获实现](https://blog.csdn.net/liulilittle/article/details/122728497)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值