美文网首页
C++教训篇:memset()方法的使用

C++教训篇:memset()方法的使用

作者: iDucky131 | 来源:发表于2020-02-28 22:06 被阅读0次

一把辛酸一把泪啊,这次又被 memset()方法给坑了,起因是创建一个 int[]的数组,想要初始化为0,但是使用 int a[n]={0} 编译器又一直提醒我,让我修改这个初始化方式,所以我就写出了下面的代码:

int a[n];sizeof(a,0,n);

结果可想而知,程序一直运行错误,直到我debug的时候才发现是 a[]初始化有问题,然后去查询了一下 memset() 的工作机制,记录一下。

函数原型: void *memset(void *s , int ch , size_t n )<br />函数作用: 将已经开辟内存空间的s的首n个字节的值设为ch<br />注意这里是空间s的前n个字节的值设置为ch,也就是说n代表的是n个字节,因而上面我们使用的n表示的是n个字节,上面的代码 sizeof(a,0,n);只是将 a[]数据的前n个字节初始化为0,但是 a[]数组一共有 n*4 个字节,即没有初始化完,所以才会运行时出错,那么应该怎么初始化呢?

int a[n];memset(a,0,sizeof(a));

sizeof()函数的作用是返回一个对象或者类型所占据的字节数,所以上面返回的就是 a[]数组所占的字节数,而又利用 memset() 函数将所有的字节都初始化为0,所以数组中每个元素都是0,初始化成功。

补充

memset()只有初始化为0的时候才可以使用上面的写法,如果想初始化为1,不能够写为: memset(a,1,sizeof(a)),这是因为 memset()是将每个字节初始化为1,而不是将一个 int类型转化为1,上述代码执行后内存存储的内容为: 0001 0001 0001 0001 0001 0001 0001 0001(假设 a[]只有1个元素),很明显 a[] 中的元素都不是1.

所以在初始化的时候尽量还是使用 for 循环的形式进行初始化,特别是初始化为非0的数据时。

但是, memset()可以完美的对 char类型的数组进行初始化,因为C++中每一个 char占据一个字节的空间,而 memset() 初始化也是以字节为单位进行的,所以就可以完美的融合。

相关文章

网友评论

      本文标题:C++教训篇:memset()方法的使用

      本文链接:https://www.haomeiwen.com/subject/yuxdhhtx.html