一把辛酸一把泪啊,这次又被 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()
初始化也是以字节为单位进行的,所以就可以完美的融合。
网友评论