【起因】希望对各种类型的数组进行初始化,避免野值
【函数头文件】提示:在linux中可以在terminal中输入 "man memset"进行查询
#include<string.h>
void *memset(void *s, int c, size_t n);
【使用说明】The memset() function fills the first n bytesof the memory area pointed to by s with the constantbytec.
【错误用法】
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
分享到:
相关推荐
Linux下替换memset为自己写的函数,但是用jmp绝对跳转时会遇到段错误的问题
优化linux系统memcpy,及memset,这两个命令占比系统非常高,现用汇编来优化
memset用法。。。。。。。。。。。。。。
memset
主要介绍了C++中memset函数用法,结合实例形式详细分析了memset函数的功能、使用方法与相关注意事项,需要的朋友可以参考下
C语言memset用法详解
memset头文件 c++版
C语言memset函数使用方法详解 一。函数原形 void * memset(void*s, int ch,size_t n) 二。函数作用 将以s内存地址为首的连续n个字节的内容置成ch,一般用来对大量结构体和数组进行清零 三。常见错误 1.搞反...
ntdll.dll中memset为一段代码,它的功能是对堆栈中的一段进行清零,在调用时需要输入3个参数,分别是需清零堆栈段的首地址,清零堆栈段大小,清零堆栈段填充的内容
在学习memset函数的时候,查了一些资料,转一个对memset()的用法的一些初浅的体会。
内容涵盖memset函数的定义、使用方法、注意事项、局限性、安全性、优化技巧以及社区支持等高级内容。 **适用人群:** 本教程适合所有对编程和C语言感兴趣的初学者,尤其是那些需要了解如何在C语言中使用memset函数的...
memset()函数的另一种纯c语言实现方式
memset,memcpy,strcpy 的用法,详细区别还有优缺点对比!
在C和C++等编程语言中,memset函数是一个用于设置内存区域内容的标准库函数。它允许程序员将指定内存区域的内容设置为一个特定的值,这在初始化数据结构、清除内存等方面非常有用。本文将深入探讨memset函数的原理、...
memset
memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int value, size_t num ); 参数说明: ptr 为要操作的内存的指针。 value 为要设置的值。你既可以向 value ...
memset概述 memset是C语言标准库中的一个重要函数,用于将指定内存区域的...此外,在处理大量数据时,使用memset进行内存填充通常比使用循环逐个设置字节更快,因此在性能敏感的应用中,memset也是一个很好的选择。