开发者社区> D_H_T> 正文

一个memset函数使用时的坑

简介: 平时使用memset函数都是用来初始化字符串,从来没有注意过它具体是怎么实现的,最近无意中发现原来这个函数里面还是有坑的。
+关注继续查看
平时使用memset函数都是用来初始化字符串,从来没有注意过它具体是怎么实现的,最近无意中发现原来这个函数里面还是有坑的。
我尝试用它来初始化整型数组
int array[10];
memset(array, 1, sizeof(a));
我原本是想将数组元素全部初始化为1,可是却是这样的:

这里写图片描述

一开始不明白为什么会这样,查了以后才知道,void *memset(void *s, int ch, size_t n)并不是直接把 ch 的值赋到 s 的元素上去。
我们先来看看这个神奇的数字:16843009 的二进制表示形式是什么:

16843009(10) = 0000 0001 0000 0001 0000 0001 0000 0001(2)

有没有看出什么规律?
也许你已经看出来了,为了更明显一些,我们换个角度看:

0000 0001 //第 3 个字节
0000 0001 //第 2 个字节
0000 0001 //第 1 个字节
0000 0001 //第 0 个字节

原来memset是以字节为单位对每个元素赋值的
再来个例子:

memset(array, 23, 16); //此处只对 16 个字节元素赋值(即4个整型)

这里写图片描述

0001 0111 //第 3 个字节
0001 0111 //第 2 个字节
0001 0111 //第 1 个字节
0001 0111 //第 0 个字节

因为字符型元素只占用一个字节,所以对字符串用memset初始化直接简单的用 ch 对每个元素赋值就行了
再来看一个例子:

memset(array, 23, 10); //如果不足一个完整的int型怎么办?

这里写图片描述

/* 10%4 == 2 第三个元素只有两个字节会被赋值*/
0000 0000//第 3 个字节
0000 0000//第 2 个字节
0001 0111//第 1 个字节
0001 0111//第 0 个字节 

平常使用memset函数注意规避这个坑足够了,如果你想了解更多关于memset函数的实现原理,请再去查看其它资料深入学习,我在此就不多做介绍了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
STL中sort、priority_queue、map、set的自定义比较函数
STL中,sort的默认排序为less,也就是说从小到大排序;priority_queue默认是less,也就说大顶堆;map默认是less,也就说用迭代器迭代的时候默认是小的排在前面;set默认是less,也就是说用迭代器迭代的时候是从小到大排序的。
1119 0
[实变函数]2.3 开集 (open set), 闭集 (closed set), 完备集 (complete set)
1        $$\beex \bea E\mbox{ 是开集}&\lra E^o=E\\        &\lra \forall\ P_0\in E,\ \exists\ U(P_0)\subset E.
968 0
Sql Server 常用函数
1、CONVERT() 函数 CONVERT(data_type(length),data_to_be_converted,style) data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。 可以使用的 style 值:点击打开链接 2、DATE
973 0
FIND_IN_SET函数
原来以为mysql可以进行这样的查询select id, list, name from table where 'daodao' IN (list);      (一)注:1. table含有三个字段id:int, list:varchar(255), name:varchar(255)实...
830 0
说说sys_context函数
  sys_context函数是Oracle提供的一个获取环境上下文信息的预定义函数。该函数用来返回一个指定namespace下的parameter值。该函数可以在SQL和PL/SQL语言中使用。
1324 0
iOS中NSSearchPathForDirectoriesInDomains函数
<h1 style="padding:0px; margin:20px 0px 10px; line-height:43.20000076293945px; font-size:24px; color:rgb(51,51,51); font-family:Verdana,sans-serif,宋体"> <span style="padding:0px; margin:0px; font-
1374 0
php中使用exec,system等函数调用系统命令
php的内置函数exec,system都可以调用系统命令(shell命令),当然还有passthru,escapeshellcmd等函数。   在很多时候利用php的exec,system等函数调用系统命令可以帮助我们更好更快的完成工作。
733 0
+关注
D_H_T
java,编程语言相关技术专家
42
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载