memset 函数的赋值问题

memset()函数原型是extern void *memset(void *buffer, int c, int count)       

buffer:为指针或是数组,

c:是赋给buffer的值,

count:是buffer的长度.


       这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer))

       Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;

      例:char a[100];memset(a, '/0', sizeof(a));

 

一开始用的时候觉得很方便,尤其是清空、初始化数组的时候。用的相当顺手,结果便碰到了初始化为1的题目,想都没想直接敲上去。

memset(a,1,sizeof(a))


结果答案匪夷所思,数变得特别大,一顿找之后才发现数组的初始化出了错,初始为16843009而不是1.

原因:


memset是按字节赋值的,取变量a的后8位二进制进行赋值。

1的二进制是(00000000 00000000 00000000 00000001),取后8位(00000001),int型占4个字节,当初始化为1时,它把一个int的每个字节都设置为1,也就是0x01010101,二进制是00000001 00000001 00000001 00000001,十进制就是16843009。

之所以输入0,-1时正确,纯属巧合。

0,二进制是(00000000 00000000 00000000 00000000),取后8位(00000000),初始化后00000000 00000000 00000000 00000000结果是0
-1,负数在计算机中以补码存储,二进制是(11111111 11111111 11111111 11111111),取后8位(11111111),则是11111111 11111111 11111111 11111111结果也是-1

而对于字符来说,memset函数是将所指向的某一块内存中的每个字节的内容全部设置为指定的ASCII值,

所以对于任何字符来说,memset都是可行的。

 

posted @ 2018-03-29 20:03  翛宁  阅读(593)  评论(0编辑  收藏  举报