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

memset函数将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。

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

#includevoid *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

程序例

#include

#include

#include

int main(void)

{

char buffer[] = "Hello world/n";

printf("Buffer before memset: %s/n", buffer);

memset(buffer, '*', strlen(buffer) );

printf("Buffer after memset: %s/n", buffer);

return 0;

}

输出结果:

Buffer before memset: Hello world

Buffer after memset: ***********

编译平台:   Microsoft Visual C++ 6.0

也不一定就是把内容全部设置为ch指定的ASCII值,而且该处的ch可为int或者其他类型,并不一定要是char类型。

例如下面这样:

int array[5] = {1,4,3,5,2};

for(int i = 0; i < 5; i++)

cout

for(int k = 0; k < 5; k++)

cout

1 4 3 5 2

0 0 0 0 0

后面的表大小的参数是以字节为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小也可能不同,所以最好用sizeof()。

要注意的是,memset是对字节进行操作 , 所以上述程序如果改为 :

int array[5] = {1,4,3,5,2};

for(int i = 0; i < 5; i++)

cout

// 注意 这里与上面的程序不同

for(int k = 0; k < 5; k++)

cout

1 4 3 5 2

16843009 16843009 16843009 16843009 16843009

为什么呢 因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用 ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是 00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。

所以用memset对非字符型数组赋初值是不可取的

例如有一个结构体Some x,可以这样清零:   memset( &x, 0, sizeof(Some) );

如果是一个结构体的数组Some x[10],可以这样:     memset( x, 0, sizeof(Some)*10 );

memset linux 头文件,linux中memset的正确用法相关推荐

  1. memset linux 头文件,linux下C/C++头文件梳理,看完这篇再也不会搞糊涂头文件了!...

    一:前言 进行linux下C/C++服务端后台开发的都知道,需要跟各种头文件打交道. 比如使用printf函数则需要引用#include ,使用STL的map容器则要#include ,使用socke ...

  2. timeval linux 头文件,linux中的struct timeval结构

    struct timeval { long tv_sec; // seconds long tv_usec; // and microseconds(百万分之一秒) }; timeval结构的用于指定 ...

  3. stricmp linux 头文件,linux windows porting

    10.error C4430: missing type specifier - int assumed. Note: C++ does not support default-int这是因为在VC6 ...

  4. printf linux 头文件,Linux C 格式化输出时要注意的问题

    在Linux下提供了以下函数提供格式化输出,printf,fprintf,sprintf,snprintf.这些函数的头文件定义都是stdio.h.为标准的C库函数. printf提供标准的输出流,f ...

  5. linux头文件怎么编译,microsoft编译器怎么使用Linux头文件

    microsoft编译器如何使用Linux头文件? #include #include #include #include #include #include #include #include #i ...

  6. linux 头文件汇总

    linux头文件 头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个.这些头文件各自的功能如下. <a.out.h& ...

  7. linux头文件 库,Linux操作系统的头文件和库文件搜索路径

    一. 头文件 1 ""中的头文件,在源文件当前目录查找 2 -I 中指定目录 -I可以在CFLAG中指定 3 gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCL ...

  8. linux的头文件下载,Linux内核头文件(linux headers)

    更新 Linux 内核头文件(linux headers) 三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文 ...

  9. Linux C try 头文件,linux c 头文件

    //1.Linux中一些头文件的作用: #include //ANSI C.提供断言,assert(表达式) #include //GCC.GTK,GNOME的基础库,提供很多有用的函数,如有数据结构 ...

最新文章

  1. S3C6410禁用和启用触摸屏
  2. 联盟和部落大战一触即发,你有票了吗?
  3. linux下程序如何实现单实例运行
  4. 全境封锁服务器维护 2018,全境封锁全域事件2018年8月活动什么时候开始_全域事件怎么玩...
  5. Android下利用Bitmap切割图片
  6. raid5 合适 多少块硬盘_分析Linux raid6同步成raid5导致数据丢失的情况
  7. object string java_Object类和String类
  8. 安卓平板外接摄像头_华为?小米?千元安卓平板如何选择?
  9. php 数值相加_php – 合并2个数组并求值(数值键)
  10. Android 10上的F2FS文件系统制作
  11. 电磁阀原理及控制方式
  12. 如何看懂EMC测试报告
  13. 2021年了!!Xftp新手的下载和安装教程(超详细),以及演示了远程登录和远程文件传输
  14. Wave VR Native SDK学习(一)
  15. Java中Object类的几个常用方法
  16. 微信小程序登录服务器失败,微信小程序后台登录一直失败
  17. oracle9i升级oracle10g
  18. 循环控制语句break,continue
  19. 离职央企中石化,转行互联网
  20. noip2015提高组初赛(答案+选择题题目+个人分析)

热门文章

  1. excel导出复杂表格
  2. mysql视图基本操作
  3. 【Web前端】——HTML基础知识总结
  4. 选对用友BI解决方案 数据才能驱动成功
  5. mysql启动不了的问题
  6. 阿里某新员工吐槽:来了两个月非常想离职,会不会被阿里拉黑?
  7. CondaHTTPError: HTTP 404 NOT FOUND for url <https://pypi.tuna.tsinghua.edu.cn/simple/noarch/repodata
  8. Linux 下载安装JDK
  9. Android:H5、web调起App并且传递参数
  10. 镭神智能N10(老版本,接口2.0)雷达调试