函数原型:
void *memset(void *s, int ch, size_t n)
实现的功能:
将 s 所指向的内存空间中的 n 个字节的空间置均为 ch 值。
其中:
s 指向要操作的内存空间首地址
ch 要赋的值
n 长度
用法(一)
memset 操作的内存空间可以是在栈区,也可以是从堆区中 new 出来的。
char * p_buf = new char [5];
memset (p_buf, 'b', 5*sizeof(char));
printf ("p_buf = %s\n", p_buf);
运行结果:
错误(一)
char * test = "abcdef";
memset (test, 0, sizeof(char));
printf ("test = %s\n", test);
常量不能被修改,因此对常量空间进行操作是非法的。在 linux 中会报 Segmentation fault 错误
错误(二)
先看一段程序和运行结果
int number = 0;
memset (&number, 1, sizeof (int));
printf ("number = %d\n", number);
printf ("number(hex)= %x\n", number);
printf ("\n");
memset (&number, -1, sizeof (int));
printf ("number = %d\n", number);
printf ("number(hex)= %x\n", number);
运行结果:
memset 是按字节进行操作的,这里的 int 占4个字节。因此对 int 型进行操作时,它的每个字节都置1,读取十进制数据时就是 16843009
错误(三)
对结构体使用 memset 不谨慎,或对类进行 memset 操作。
比如,在结构体中定义了指针变量,用 memset 会造成内存泄漏。
struct test
{
int ab;
int *p;
};
int main (int argc, char ** argv)
{
test te;
te.p = new int [10];
printf ("te = %x\n", te.p);
memset (&te, 0, sizeof(test));
printf ("te = %x\n", te.p);
return 0;
}
结果:
指针p 指向地址0,而 new 出来的空间还未被释放,内存泄露。
关于在 VS2012 中对string类进行了memset 操作而程序正常运行,linux中同样的操作报段错误,可以去看下两者string类的实现方式。
总而言之,类的初始化应使用其构造函数,不应使用 C 语言的方法来对类进行操作,破坏其内部结构。