现在的位置: 首页 > 综合 > 正文

memset函数分析与迷惑

2013年09月20日 ⁄ 综合 ⁄ 共 746字 ⁄ 字号 评论关闭

以下是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型数据。。。这种做法更是理解不了,希望本文读者有知道的,可以留言,在此谢过!

抱歉!评论已关闭.