学习借鉴自:https://blog.csdn.net/yexiaohhjk/article/details/52717934

memset是C语言头文件<string.h>中的一个函数,作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法

memset(数组名,赋值变量,数组长度);

void *memset(void *s, int ch, size_t n);

初始化清零是  memset(a,0,sizeof(a));
初始化无穷大是  memset(a,0x3f,sizeof(0x3f));

memset的赋值规则:

逐一对数组范围内的每个字节进行赋值(一字节 = 8_bit,1_bit = 一位二进制数)也就是也就赋值有效数值在8_bit(两位16进制);

假设我们对一个长度为2的int型数组进行赋值 0x3f4f5f6f(0x表示16进制,该数表示6进制数3F4F5F6F)memset(a,0x3f4f5f6f,sizeof(a))

在存储单元中就将得到 6F 6F 6F 6F    6F 6F 6F 6F

那么坑人的问题就出来了 a[0]=6F 6F 6F 6F ,而我们原来要的结果是把0x3f4f5f6f赋值给a数组;

当我们要用0x3f4f5f6f与a数组中的值对比时你就会发现不等于,那么我们的赋值就失去意义

现在我们用0x6f 赋值:

在存储单元中就将得到 6F 6F 6F 6F    6F 6F 6F 6F

#include<cstring>//C语言头文件在C++中的用法
#include<cstdio>
using namespace std;
int main(){
int a[];
printf("a数组字节数:\n%d\n",sizeof(a)); memset(a,0x6f,sizeof(a));
printf("给a数组赋值为0x6f:\n");
for(int i=;i<;i++)
printf("%d ",a[i]);
printf("\n"); memset(a,0x3f4f5f6f,sizeof(a));
printf("给a数组赋值为0x3f4f5f6f:\n");
for(int i=;i<;i++)
printf("%d ",a[i]);
printf("\n"); printf("赋值0x3f4f5f6f后的数组是否于0x3f4f5f6f相等:");
if(a[]==0x3f4f5f6f)
printf("yes");
else
printf("no");
return ;
}

当memset(,1,sizeof()); 1转为二进制0000 0001,当做一字节,一字节8位,int为4字节,所以初始化完每个数为0000 0001 0000 0001 0000 0001 0000 0001 = 16843009;

赋值无穷大问题:

这个问题是在我做最短路问题时,遇到的明明代码对了,却一直得不到想要的答案,最后对比别人的代码发现问题原来我的预设的无穷大值是0x3f3f3f;

那么就会出现上述的问题,数组值不等于我们赋的值。

赋值int型时,int型的位数根据编译器而定,现在一般主流的编辑器都是4字节,赋无穷大值时我们一般赋值所有 bit 位全 1 ,留一位当符号位,其余全1刚好是0x7fffffff

为什么无穷大值不取0x7fffffff,这个数是32_bit中最大的值,而取0x3f3f3f3f或0x3f(取0x3f时比较相等要和0x3f3f3f3f比),在编程过程中我们给一个数组赋值后是需要使用的,

如果你设置一个这么大的数的话,当进行加和操作的时候很容易数据溢出,而得到一个负数。所以这个数还需要能做的“无穷大加无穷大等于无穷大”,所以我们取0x3f3f3f3f或0x3f。

数值上0x3f3f3f3f是10^9,一般当无穷大已经够了,又满足“无穷大加无穷大等于无穷大”

关于memset赋值问题的更多相关文章

  1. 关于memset赋值无穷大无穷小

    memset(a,,sizeof(a)); 即得到无穷大. memset(a,,sizeof(a)); 即得到无穷小,与上述的值互为相反数. memset(a,,sizeof(a)); 即近似为第一个 ...

  2. memset赋值

    比较神奇的事情 可能和二进制有关系吧 #include<bits/stdc++.h> using namespace std; ]; int main(){ memset(f,,sizeo ...

  3. 关于memset的赋值(最大值最小值的选择)

    memset赋值赋的是ASSCII码转为二进制赋值 比如 memset(,0xff,sizeof()),0xff转为二进制11111111,int为4字节所以最后为111111111111111111 ...

  4. 关于memset函数--赋最大值

    问题起源: 这几天在刷CCF的时候,图论那边经常用到赋最大值,一开始自己一直手工for循环赋值(INT_MAX或者是LONG_LONG_MAX),后来看到别人的代码,发现了一个比较高端的赋值  mem ...

  5. 2018/08/23 cstring中memset()函数的运用

    好多东西其实以前已经查过了,然后当时理解的还行,可是过段时间没用有些又会忘记,然后又去找资料又查,浪费了不少的时间和精力,所以,我,曾国强,今天起,要好好做笔记了! 今天复习第一个知识点,为什么要叫复 ...

  6. 使用memset初始化int数组

    memset()是一个来自于string库的函数,正规用法是初始化char类型的数组.因为char类型只占1个字节,memset按字节赋值后,会将char类型数组的所有元素变为你指定的值.但是4字节的 ...

  7. 关于memset的使用

    有些oj上的G++支持 cstdio的memset,有些则支持stdio.h中的memset(划掉) 这两个头文件关系比较复杂, 具体我也说不清...按照c++文档中的说法,stdio已经deprec ...

  8. POJ 1088

    http://poj.org/problem?id=1088 一道中文题,这道题如果不限时的话,是个简单的搜索,但限时的话,就要用记忆化搜索 所谓记忆化搜索就是对每一次搜索的结果进行记录,然后之后的如 ...

  9. 【细小碎的oi小知识点总结贴】不定时更新(显然也没人看qwq)

    1.memcpy: 从a数组中复制k个元素到b数组: memcpy(b,a,sizeof(int)*k); #include<cstring> #include<iostream&g ...

随机推荐

  1. Object.keys方法之详解

    在实际开发中,我们有时需要知道对象的所有属性,原生js给我们提供了一个很好的方法:Object.keys(),该方法返回一个数组 传入对象,返回属性名 var obj = {'a':'123','b' ...

  2. Python爬虫入门之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  3. Python-点滴

    本节内容: python简介 安装(python,pycharm) 第一个程序(Hello,World!) 变量 用户输入 字符编码 格式化输出 if流程控制 while循环 for循环 一.Pyth ...

  4. linux安装命令出错(could not resolve host mirrorlist.centos.org)

    本次问题出现在虚拟机安装的centos7系统之后,使用yum命令安装wget命令(yum -y install wget),出现could not resolve host mirrorlist.ce ...

  5. javascript数据加减问题

    需要parseInt把获取到的html(),text()的值转换为数字型,然后进行加减乘除操作就可以了:

  6. (2018 Multi-University Training Contest 3)Problem L. Visual Cube

      //题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6330//题目大意:按照一定格式画出一个 a×b×c 的长方体.  #include <b ...

  7. image-to-image translation with conditional adversarial networks文献笔记

    Image-to-Image Translation with Conditional Adversarial Networks (基于条件gan的图像转图像) 作者:Phillip Isola, J ...

  8. Traceur

    直接插入网页 <!-- 加载Traceur编译器 --> <script src="http://google.github.io/traceur-compiler/bin ...

  9. L362 When to Bring up Salary During the Job Interview Process

    Money is an awkward topic of conversation for many professionals—even more so when you’re busy tryin ...

  10. 【原创】使用开源libimobiledevice盗取iphone信息

     一.概述     libimobiledevice可以理解为Linux系统下的iTunes,破解了iTunes的通信协议. 依赖:https://github.com/libimobiledevic ...