一个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函数的实现原理,请再去查看其它资料深入学习,我在此就不多做介绍了。
一个memset函数使用时的坑相关推荐
- linux应用参数 冒号,Lua-面向对象中函数使用时冒号(:)和点(.)的区别
Lua-面向对象中函数使用时冒号(:)和点(.)的区别,我们先来看一段简单的代码: local Animal ={}functionAnimal:Eat( food )print("Anim ...
- vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个
vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个 原因: Cont是容器的类型,容器中定义了一个此容器所用的游标(迭代器)的类型,叫iterator,于 ...
- Xcode 9使用时那些坑
我目前使用Xcode9发现一些奇怪的坑,坑的不要不要的..... 1.本地图片怎么也不显示(新拖入的图片),如果之前的用xcode8开发的项目拖入的图片再用xcode9打开没有影响,但是在Xcode9 ...
- memmove函数使用时注意的问题
首先,来了解一下memmove函数的声明类型,Linux c中的定义如下: #include <string.h> void *memmove(void *dest, const void ...
- 关于ADAMS中AZ函数使用时的一些心得
今天做仿真时,发现使用AZ函数时的一些注意事项: 一: 其中MARKER_1需要是作用part(或者说受力运动的那个part)上的点,MARKER_33是与作用part相连的那个pa ...
- Matlab imshow(f,G)函数使用时出现错误
imshow(f,G)使用时出现错误 ① imshow(h,128) 错误使用 imshow>preParseInputs (line 467) IMSHOW 语法无效. 出错 imshow ( ...
- php crc32 作用,php的crc32函数使用时需要注意的问题(不然就是坑)
前几天写了一个分表程序,用的hash算法是crc32.分表的函数如下: 复制代码 代码如下: function _getHash($username) { $hash = crc32($usernam ...
- GetMessage()函数使用时的注意
GetMessage()函数是一个很常见的函数,如果使用SDK写过Windows程序的话,那么就更不陌生,该函数的返回值值得注意的地方,因为最近在看Win32汇编的书,书中提到了这个函数.但是发现对于 ...
- strstr(str1,str2)函数使用时注意事项
可能有的人还没听过strstr函数,个人认为这个一个很实用的函数,strstr(str1,str2) 函数是字符串处理函数之一,位于头文件 "string.h"中.对于处理字符串的 ...
最新文章
- java web 监听器 例子_Java web技术应用---监听器
- docker 启动petalinux镜像脚本
- CentOS 7 快速部署 ELK
- python ppt自动生成_如何自动化生成PPT缩略图?
- shrio 登陆后 还是失效_在 iPhone 上取消订阅后,应用或内容会立即失效吗?
- python爬取网页上的特定链接_python 用bs4解析网页后,如何循环打开爬取出来的网址链接?...
- Java中引入泛型的好处
- leetcode python3 简单题232. Implement Queue using Stacks
- jQuery.each方法
- 【综述】2018年的一篇NER综述笔记
- 需求分析-业务需求、用户需求、功能需求
- linux平台 doc转pdf,linux doc ppt 转 pdf
- ps怎么打开php图片大小,如何使用ps修改图片尺寸
- c语言做游戏音效,游戏背后辛苦付出的劳动者—游戏音效师
- source-map配置
- 一文让你初步了解壮族——一个奇葩但同样优秀的民族
- TeamViewer:一路前行,用技术实现领域更新
- Java实现斗地主发牌及排序功能[小白篇]
- 百度云PCS调试过程
- 记一次IBM面试经历