memset函数分析与迷惑

以下是memset的源码
void * __cdecl memset (
        void *dst,
        int val,
        size_t count
        )
{
        void *start = dst;

#if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC)
        {
        extern void RtlFillMemory( void *, size_t count, char );

        RtlFillMemory( dst, count, (char)val );
        }
#else  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */
        while (count--) {
                *(char *)dst = (char)val;
                dst = (char *)dst + 1;
        }
#endif  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */

        return(start);
}

通用函数(大多传入参数是void 类型的),然后在函数里面强制转换为char型,也就是按照字节处理,因为字节是最小内存单元。这样就能涵盖所有类型的传入参数。

memset这个函数也不例外,它的作用是给一段内存设置我们写入的值。

第一个传入参数是void *,需要设置的内存首地址;第二个是int val,需要设置的数值;第三个 count ,需要设置的内存长度。

第一个和第三个都好理解。问题在于第二个 val ,函数的传入类型是 int 型,在函数体内却强制转换为char。想不通这种做法有什么好处,为什么不在传参的时候直接传入一个char型数据?在有的编译器中如IAR,甚至将强制转化为char赋给const型数据。。。这种做法更是理解不了,希望本文读者有知道的,可以留言,在此谢过!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值