linux C 之 memset 用法
来源:互联网 发布:黑马程序员项目 编辑:程序博客网 时间:2024/04/29 01:28
【起因】希望对各种类型的数组进行初始化,避免野值
【函数头文件】 疑问提示:在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)来计算,这样避免出错!是不是很强大?
- linux C 之 memset 用法
- C函数之memset()函数用法
- C函数之memset()函数用法
- C函数之memset()函数用法
- c/c++ memset用法
- C函数之memcpy()、Memset ()、Strcpy ()函数用法
- C语言之memset
- C语言之memset函数
- linux系统库函数之memset
- c中的memset函数的用法?
- c/c++中memset()函数的用法
- c语言中memset()的用法
- c语言中的memset的用法
- c语言中函数memset()用法
- linux中memset的正确用法
- linux中memset的正确用法
- linux中memset的正确用法
- linux中memset的正确用法
- size_t、ssize_t
- sybase数据库触发器
- makefile
- C语言堆栈入门——堆和栈的区别
- Android中的Telephony学习笔记(8)-NeighboringCellInfo
- linux C 之 memset 用法
- 提取EXCEL表格中特定列内容保存至txt文档
- sybase存储过程一 存储过程介绍
- 跟我学Rsyslog
- 92. 当开发与测试精诚合作
- 学习C/C++语言:判断是否为闰年
- NYOJ 847 S + T
- spring security3刷新内存中已加载的资源信息
- 我的Ubuntu声卡解决方案