memset 函数的赋值问题

Posted 难得~翛宁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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都是可行的。

 

以上是关于memset 函数的赋值问题的主要内容,如果未能解决你的问题,请参考以下文章

memset初始化

关于memset问题,请问下列的值都可以吗

C语言中,memset函数都可以给啥类型的数组清零?

奇怪的笔记酱

为数组赋值:memset vs for 循环

c语言memset(&a, 0, sizeof(struct customer));