memset为内存填充函数,包含在<string.h>头文件中,可以用它对一片内存空间进行初始化,其原型为
void *memset(void *s, int v, size_t n);
英文释义如下:
Copies the value v (converted to type unsigned char) to the first n bytes pointed to by s; returns s.
这里s可以是数组名,也可以是指向某一内在空间的指针;v为要填充的值;n为要填充的字节数,通常为sizeof(s);
使用memset时要注意的是,memset是逐字节进行填充,所以s一般为char *型。
对于其它类型的s,可以填充的值有两个,0和-1。这是因为计算机中用二进制补码表示数字,0的二进制补码为全0,-1的二进制补码为全1。如果要初始化为其它的值,可以用一个for循环,如下:
for (int i=0; i<n; i++)
{
s[i] = v;
}
memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);
memset可以方便的清空一个结构类型的变量或数组。
如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
对于变量
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]='/0';
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[10];
则
memset(TEST,0,sizeof(struct sample_struct)*10);
对于赋特定的值,需注意
char a[5];
memset(a,1,5); //成功赋值为0x01
int a[5];
memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的
因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的。
而第二个程序a是整型的,使用memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。