memset()函数及其作用

旧城冷巷雨未停 提交于 2020-01-31 09:50:32

我曾天真的以为 memset(a,0,sizeof(a))中的0可以用任意数替换

但是~

实际上这是错误的
memset的功能 : 是将一快内存中的内容以单个字节逐个拷贝的方式放到指定的内存中去.

对于这一点我们拿memset(a, -1, sizeof a), 和memset(a, 1, sizeof a) (a为int类型)两个表达式进行举例.

先看memset(a, -1, sizeof a):

1个int是四个字节:

-1 的补码是 11111111 11111111 11111111 11111111 (int)

memset中的-1之占据一个字节 11111111 ()

memset()函数每次拷贝 拷贝一个字节,即: 11111111, 由于int中-1的四个字节都是相同的,所以最终结果能正确的输出-1;

表达式换成memset(a, 1, sizeof a)的话,

1 的源码和补码相同都是 00000000 00000000 00000000 00000001(int)

memset中的1占据一个字节 00000001

memset()执行过后,每次拷贝一个字节,即00000001,一个int就是4个字节合并到一起

就是 00000001 00000001 00000001 00000001 进行输出的话就是16843009

所以这段代码执行过后会输出 5个 16843009

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
     int a[5];
     memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的
     for(int i = 0;i < 5;i++)
       cout<<a[i]<<"   ";
     system("pause");
     return 0;
}

​ --------我是分割线----------

介绍几个常用的
memset(a,-1,sizeof(a)) 每个都会变为-1
memset(a,0,sizeof(a)) 每个都会变为0
memset(a,0xnfnfnfnf,sizeof(a)) 每个都会变为0xnfnfnfnf
memset(a,0xnf,sizeof(a)) 每个都会变为0xnfnfnfnf (可以看到简化了上面那句)
我们一般用n=3的情况(防止溢出)
memset(a,0x3f,sizeof(a)) 每个都会变为0x3f3f3f3f (可以看到简化了上面那句)
memset(a,127,sizeof(a)) 每个都会变为1061109567
memset(a,63,sizeof(a)) 每个都会变为1061109567
也看到过有人写
memset(a,127/3,sizeof(a)) 每个都会变为707406378
无穷大的值可采用上面的这些方法

无穷小的值
memset(a,128,sizeof(a)) 每个都会变为-2139062144

解释:
128 (128的二进制是10000000)则放的是10000000 10000000 10000000 10000000 (转化为十进制)
因为最高位是1 所以是负数,因为这是补码,还原成原码
补码 10000000 10000000 10000000 10000000
反码 11111111 01111111 01111111 01111111 符号位不变,按位取反
原码 11111111 01111111 01111111 10000000 +1 = (-2139062144)10

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!