memset用法与常见错误

函数原型:

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 语言的方法来对类进行操作,破坏其内部结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值