memset函数原型为void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
实际上就是用来给一片内存区域进行初始化,比说创建数组
int * save=new int[10];
对save数组初始化不想采用循环赋值的形式,就可以用memset库函数。
测试代码如下:
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int * save = new int[10];
for (int test = -2; test < 2; test++)
{
memset(save, test, 10 * sizeof(int));
for (int i = 0; i < 10; i++)
cout << save[i] << " ";
cout << endl;
}
system("pause");
return 0;
}
测试结果如下:
从上面可以看到,只有 0 和 -1 被正确赋值,其他的出现了状况,原因是memset是对每一个字节进行赋值,而计算机系统中每一个int占据了好几个字节的空间。
在32位系统中,每一个int的大小为4个字节,负数在计算机中的表示是补码形式进行存储的(正数原码和补码相同,也可认为整数在计算机中的存储方式为补码)
首先来看1的表示
0000 0001|0000 0001|0000 0001|0000 0001
转换为十进制数就是16843009
对于-2在计算机中的表示为
1111 1110|1111 1110|1111 1110|1111 1110
转换为十进制数就是-16840010
而0在计算机中的表示为
0000 0000|0000 0000|0000 0000|0000 0000
1在计算机中的表示为
1111 1111|1111 1111|1111 1111|1111 1111
0和1在计算机中的表示高字节和低字节相同,导致转换为十进制数后值并不会发生变化,所以通常memset初始化数组时使用0或-1 比较好。