平时使用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函数使用时的坑相关推荐

  1. linux应用参数 冒号,Lua-面向对象中函数使用时冒号(:)和点(.)的区别

    Lua-面向对象中函数使用时冒号(:)和点(.)的区别,我们先来看一段简单的代码: local Animal ={}functionAnimal:Eat( food )print("Anim ...

  2. vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个

    vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个 原因: Cont是容器的类型,容器中定义了一个此容器所用的游标(迭代器)的类型,叫iterator,于 ...

  3. Xcode 9使用时那些坑

    我目前使用Xcode9发现一些奇怪的坑,坑的不要不要的..... 1.本地图片怎么也不显示(新拖入的图片),如果之前的用xcode8开发的项目拖入的图片再用xcode9打开没有影响,但是在Xcode9 ...

  4. memmove函数使用时注意的问题

    首先,来了解一下memmove函数的声明类型,Linux c中的定义如下: #include <string.h> void *memmove(void *dest, const void ...

  5. 关于ADAMS中AZ函数使用时的一些心得

    今天做仿真时,发现使用AZ函数时的一些注意事项: 一:          其中MARKER_1需要是作用part(或者说受力运动的那个part)上的点,MARKER_33是与作用part相连的那个pa ...

  6. Matlab imshow(f,G)函数使用时出现错误

    imshow(f,G)使用时出现错误 ① imshow(h,128) 错误使用 imshow>preParseInputs (line 467) IMSHOW 语法无效. 出错 imshow ( ...

  7. php crc32 作用,php的crc32函数使用时需要注意的问题(不然就是坑)

    前几天写了一个分表程序,用的hash算法是crc32.分表的函数如下: 复制代码 代码如下: function _getHash($username) { $hash = crc32($usernam ...

  8. GetMessage()函数使用时的注意

    GetMessage()函数是一个很常见的函数,如果使用SDK写过Windows程序的话,那么就更不陌生,该函数的返回值值得注意的地方,因为最近在看Win32汇编的书,书中提到了这个函数.但是发现对于 ...

  9. strstr(str1,str2)函数使用时注意事项

    可能有的人还没听过strstr函数,个人认为这个一个很实用的函数,strstr(str1,str2) 函数是字符串处理函数之一,位于头文件 "string.h"中.对于处理字符串的 ...

最新文章

  1. java web 监听器 例子_Java web技术应用---监听器
  2. docker 启动petalinux镜像脚本
  3. CentOS 7 快速部署 ELK
  4. python ppt自动生成_如何自动化生成PPT缩略图?
  5. shrio 登陆后 还是失效_在 iPhone 上取消订阅后,应用或内容会立即失效吗?
  6. python爬取网页上的特定链接_python 用bs4解析网页后,如何循环打开爬取出来的网址链接?...
  7. Java中引入泛型的好处
  8. leetcode python3 简单题232. Implement Queue using Stacks
  9. jQuery.each方法
  10. 【综述】2018年的一篇NER综述笔记
  11. 需求分析-业务需求、用户需求、功能需求
  12. linux平台 doc转pdf,linux doc ppt 转 pdf
  13. ps怎么打开php图片大小,如何使用ps修改图片尺寸
  14. c语言做游戏音效,游戏背后辛苦付出的劳动者—游戏音效师
  15. source-map配置
  16. 一文让你初步了解壮族——一个奇葩但同样优秀的民族
  17. TeamViewer:一路前行,用技术实现领域更新
  18. Java实现斗地主发牌及排序功能[小白篇]
  19. 百度云PCS调试过程
  20. 记一次IBM面试经历

热门文章

  1. Python global文件的全局变量使用
  2. freemaker中小数展示为整数的问题
  3. COSC 1047 – Winter 2019 – Assignment
  4. 1.搭建JavaEE开发环境
  5. Ubuntu16.04安装使用wineqq
  6. x86_64的内存映射
  7. jQuery.Callbacks之demo
  8. 玩玩IronPython
  9. [翻译]当SA帐号丢失时怎么办
  10. 近日的思绪(外三首)