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