头文件:
#include<cstring> //C++
//#include<string.h> //C
通常我们都是利用memset()来让数组置零
int ar[10];
memset(ar, 0, sizeof(ar));
for (int i = 0; i < 10; i++)
cout << ar[i] << " ";
输出:0 0 0 0 0 0 0 0 0 0
但是,置为其他数时:
int ar[10];
memset(ar, 1, sizeof(ar));
for (int i = 0; i < 10; i++)
cout << ar[i] << " ";
输出:16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009
得到的并不是想要的初值。
为什么会出现这种结果呢??
看了memset()函数的详细说明,如下:
函数原型:
void * memset( void * dest, int ch, std::size_t count );
参数:
dest - 指向要填充的对象的指针
ch - 填充字节
count - 要填充的字节数功能:
转换值 ch 为 unsigned char 并复制它到 dest 所指向对象的首 count 个字节。
原来memset()函数是按字节赋值,第二个参数ch的取值范围是:0 ~ 255,这个函数的本意是给char类型数组赋初值(1个char类型正好为1个字节,这也就是为什么这个函数包含在< cstring >头文件中了),如下:
char ar[10];
memset(ar, '$', sizeof(ar));
for (int i = 0; i < 10; i++)
cout << ar[i] << " ";
输出:$ $ $ $ $ $ $ $ $ $
int类型长度为4个字节;
当置为0时:memset(ar, 0, sizeof(ar));
每个字节赋上00000000,4个字节得到的是00000000000000000000000000000000,结果为0。
但是当置为1时:memset(ar, 0, sizeof(ar));
每个字节赋上00000001,4个字节得到的是00000001000000010000000100000001,换算成十进制就正好就是之前的16843009。
总结
memset()函数一般只用于数组置零或char类型数组赋初值