之前只是知道memset一般只用来赋初值,后来一次看cplusplus看到了关于memset的描述,发现它是将设定的值怎么转化成字符..但是当时很迷,有很偶然的机会看到了下面的文章,觉得还好,放在这里做个记录吧~
读一下下段程序段,你认为f中执行下列语句后会出现什么值呢?
当然,首先想到的一定是1.f中的值都被赋为了1。
memset(f,0,sizeof(f))能够实现对f的清0工作。
但是你要是运行上述程序段,你会发现你的想法完全错了。输出的结果是16843009!!!输出的是乱码?让我们看看memset的函数原型:
#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);
}
其实memset是对每个字节赋值,而我们给赋值的是int型的数据,有四个字节,所以数组f中的每个数据被赋作了00000001000000010000000100000001,也就是十进制的16843009.
而对0,赋值的时候,赋成0x0000,还是0;对-1赋值为0xFFFF,与F没多大区别,都是-1的补码。所以这两个特殊值不会有错。
关于NULL,/0:
stdio.h中有这句:
#define NULL 0
NULL在编译时都转换为0了;
/0是ascll码中编号为0的那个字符,也就是(int)(/0)==0;
所以memset(a,’/0’,sizeof(a))也是对的。
要对其他值进行赋值,还是用循环赋值更方便些,memset就帮不了什么忙了。
转自 http://blog.163.com/wuzi_@126/blog/static/73817283200893175543889/