精华内容
下载资源
问答
  • 1.我也曾天真的以为 memset(a,0,sizeof(a))中的0可以任意数替换 实际上这是错误的 memset的功能是将一快内存中的内容以单个字节逐个拷贝的方式放到指定的内存中去。 2.介绍几个常用的 memset(a,-1,sizeof...

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

    实际上这是错误的

    memset的功能是将一快内存中的内容以单个字节逐个拷贝的方式放到指定的内存中去。

    2.介绍几个常用的

    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

    ---------------------

    作者:god_speed丶

    来源:CSDN 原文:https://blog.csdn.net/qq_38677814/article/details/80771514

    版权声明:本文为博主原创文章,转载请附上博文链接!

    转载于:https://www.cnblogs.com/ljy-endl/p/11236200.html

    展开全文
  • memset()函数怎么用

    2019-06-21 09:32:11
    0 问题引入 将一个n*m的二维数组 a 初始化为 0 ; 朴素的代码: for(int i=1;i<=n;i++) { for(int j=1;...C++给了一个memset()函数,可以...以上两段代码实现的结果,都是满足题意的,但是同学们希望能用memset...

    0 问题引入

    将一个n*m的二维数组 a 初始化为 0 ;
    朴素的代码:

    for(int i=1;i<=n;i++)
    {
    	for(int j=1;j<=m;j++)
    	{
    		a[i][j]=0;
    	}
    }
    

    C++给了一个memset()函数,可以大幅降低代码量:

    memset(a,0,sizeof(a));
    

    以上两段代码实现的结果,都是满足题意的,但是同学们希望能用memset实现更多的功能,尝试能否解决:


    1 慎用memset():

    • 如上面的例题,需要对(整数)数组进行初始化,最简单的方法是直接枚举修改,在特殊情况下,可以使用memset()函数来替代。
    • 特殊情况:99%的时候是指初始化为 0-1 ,其他情况需要慎重使用。

    2 二进制存储原理分析:

    • 整数的二进制存储情况:每8位一个字节,一个整数是32位,所以一个整数有4个字节;
      a=0 的时候,二进制表现如下:
      在这里插入图片描述
      a=8 的时候,二进制表现如下:
      在这里插入图片描述
    • memset()函数不是按照int类型的位置一格一格地更新数据的
    • memset()是以字节为单位,进行初始化的:
      也就是说,memset()是把一个整数拆成4份,把每一份都做一次同样的操作,例如:
      1 对一个数用memset(a,1,sizeof(a)),就会变成下图:
      答案是16843009:,并不是你想要的1;
      在这里插入图片描述
      2 对一个数用memset(a,8,sizeof(a)),就会变成下图:
      答案是:134744072,并不是你想要的8;
      在这里插入图片描述
    • 所以,平时我们用memset(a,0,sizeof(a)),是没问题的,但是-1呢?
      -1的存储,是用补码的形式的,正反补码请阅读百度详解
      所以memset(a,-1,sizeof(a))的存储,以补码的形式,如下:
      答案是:-1
      在这里插入图片描述

    3 想批量设定一个较大值怎么办?

    因为每次只考虑8位(1个字节),所以只要把单个字节的值设到尽可能大,则基本满足目标:
    所以 memset(a,127,sizeof(a));如下图,则:
    答案是:2139062143
    在这里插入图片描述

    4 综上所述:

    memset(a,0,sizeof(a));		//将数组批量修改为 0 
    memset(a,-1,sizeof(a));		//将数组批量修改为 -1 
    memset(a,127,sizeof(a));	//将数组批量修改为 2139062143
    

    5 字符数组只有一个字节:

    你掌握了吗?

    展开全文
  • Memset函数怎么用?它是干啥用的? 如何使用参数初始化表? 构造函数使用之如何根据输入变量的长度动态申请内存空间? 如下示例: #include<iostream> usingnamespacestd; #include<string> ...

    目录

     

    构造函数使用之如何根据输入变量的长度动态申请内存空间?

    内存空间的动态申请new与动态释放delete的搭配使用

    在下列三种情况下,析构函数被自动执行

    Memset函数怎么用?它是干啥用的?

    如何使用参数初始化表?


    构造函数使用之如何根据输入变量的长度动态申请内存空间?

    如下示例:

    #include <iostream>  
    using namespace std;  
    #include<string>  
      
    class Cstudent  
    {  
    private:  
        int mark;  
        char *name;  
    public:  
        Cstudent(int mark, char *name) // 类类型内只能由一个析构函数但可以有多个构造函数  
        {  
            int i = sizeof(name);  
            this->name = new char[i];  
            memset(name, 0, i + 1); // 该函数直接对内存进行赋值操作,对于含有大量元素的数组来说极为有用  
            strcpy(this->name, name);  
      
            this->mark = mark; // this指针代表本对象的地址,this->成员变量代表对象的成员变量与函数的形参区分开来  
        }  
        ~Cstudent(); // 切记:析构函数只能有一个,它只在对象被释放的时候被调用,用来在对象被删除之前向外界传递消息  
    };  
      
    Cstudent::~Cstudent()  
    {  
        if (name) // 如果成员变量name指针不为空  
        {  
            delete[] name; // 自动判断动态申请内存大小并且释放  
        }  
        cout << "析构函数被调用,对象被释放" << endl;  
    }  
      
    int main()  
    {  
        char name[] = "超级无敌霸霸强";  
        Cstudent student(89, name);  
    }

     

     

    内存空间的动态申请new与动态释放delete的搭配使用

    这里就涉及到一个问题:在哪里用new动态申请,在哪里用delete动态释放:

    这里就引出了“构造函数”&“析构函数”:构造函数中我们可以动态申请变量,在析构函数中我们可以动态释放内存,他们两个就像一堆不可分割的兄弟,一个负责节目开始的筹备工作,一个负责节目的收尾工作,但是要注意的是析构函数是去执行内存释放前的收尾工作,并不是去操控内存删除对象,同理,构造函数不是去声明定义类对象而是在定义对象后去初始化类对象。

    如下所示:

    #include <iostream>  
    using namespace std;  
    #include<string>  
      
    class Cstudent  
    {  
    private:  
        int mark;  
        char *name;  
    public:  
        Cstudent(int mark, char *name) // 类类型内只能由一个析构函数但可以有多个构造函数  — 筹备工作show time
        {  
            int i = sizeof(name);  
            this->name = new char[i];  
            memset(name, 0, i + 1); // 该函数直接对内存进行赋值操作,对于含有大量元素的数组来说极为有用  
            strcpy(this->name, name);  
      
            this->mark = mark; // this指针代表本对象的地址,this->成员变量代表对象的成员变量与函数的形参区分开来  
        }  
        ~Cstudent(); // 切记:析构函数只能有一个,它只在对象被释放的时候被调用,用来在对象被删除之前向外界传递消息  
    };  
      
    Cstudent::~Cstudent()  // 收尾工作show time
    {  
        if (name) // 如果成员变量name指针不为空  
        {  
            delete[] name; // 自动判断动态申请内存大小并且释放  
        }  
        cout << "析构函数被调用,对象被释放" << endl;  
    }  
      
    int main()  
    {  
        char name[] = "超级无敌霸霸强";  
        Cstudent student(89, name);  
    }

     

    在下列三种情况下,析构函数被自动执行

    以下几种情况会自动调用析构函数:

    ①、如果在一个函数中定义了一个局部对象,那么当这个函数执行结束时也就是该类对象生命周期结束的时候,所以类的析构函数会被自动调用;

    ②、被声明成全局类类型或者static类类型的对象,他们的生命周期一般是在程序退出的时候,这时候该对象的析构函数才会被调用;

    ③、如果是用new操作符动态的动态创建了一个类对象,只有当用delete进行释放该对象的时候,析构函数才会被调用。

    总之,就是类对象的声明周期结束之时,就是析构函数调用之时。

    Memset函数怎么用?它是干啥用的?

    每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为:

    # include <string.h>  
    void *memset(void *s, int c, unsigned long n); 

     

    函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。

    如下示例:

    # include <stdio.h>  
    # include <string.h>  
    int main(void)  
    {  
        int i;  //循环变量  
        char str[10];  
        char *p = str;  
        memset(str, 0, sizeof(str));  //只能写sizeof(str), 不能写sizeof(p)  
    }  
    // 结果:把str字符型数组初始化为{0,0,0,0,0,0,0,0,0,0}  
    

     

    如何使用参数初始化表?

    使用方式如下所示:

    class CStudent //  类类型声明原型  
    {  
    private:  
        int mark;  
        string name;  
        float height;  
    public:  
        CStudent(int Dmark, string Dname, float Dheight) :mark(Dmark), name(Dname), height(Dheight)  
        {} // 千万不要忘记大括号,即使里面为空也要写上  
        ~CStudent(){}  
    }; 

     

     

    展开全文
  • 平时使用memset函数都是用来初始化字符串,从来没有注意过它具体是怎么实现的,最近无意中发现原来这个函数里面还是有坑的。 我尝试它来初始化整型数组 int array[10]; memset(array, 1, sizeof(a)); ...
    平时使用memset函数都是用来初始化字符串,从来没有注意过它具体是怎么实现的,最近无意中发现原来这个函数里面还是有坑的。
    我尝试用它来初始化整型数组
    
    int array[10];
    memset(array, 1, sizeof(a));
    我原本是想将数组元素全部初始化为1,可是却是这样的:
    

    这里写图片描述

    一开始不明白为什么会这样,查了以后才知道,void *memset(void *s, int ch, size_t n)并不是直接把 ch 的值赋到 s 的元素上去。
    我们先来看看这个神奇的数字:16843009 的二进制表示形式是什么:

    16843009(10) = 0000 0001 0000 0001 0000 0001 0000 0001(2)

    有没有看出什么规律?
    也许你已经看出来了,为了更明显一些,我们换个角度看:

    0000 0001 //第 3 个字节
    0000 0001 //第 2 个字节
    0000 0001 //第 1 个字节
    0000 0001 //第 0 个字节

    原来memset是以字节为单位对每个元素赋值的
    再来个例子:

    memset(array, 23, 16); //此处只对 16 个字节元素赋值(即4个整型)

    这里写图片描述

    0001 0111 //第 3 个字节
    0001 0111 //第 2 个字节
    0001 0111 //第 1 个字节
    0001 0111 //第 0 个字节

    因为字符型元素只占用一个字节,所以对字符串用memset初始化直接简单的用 ch 对每个元素赋值就行了
    再来看一个例子:

    memset(array, 23, 10); //如果不足一个完整的int型怎么办?

    这里写图片描述

    /* 10%4 == 2 第三个元素只有两个字节会被赋值*/
    0000 0000//第 3 个字节
    0000 0000//第 2 个字节
    0001 0111//第 1 个字节
    0001 0111//第 0 个字节 

    平常使用memset函数注意规避这个坑足够了,如果你想了解更多关于memset函数的实现原理,请再去查看其它资料深入学习,我在此就不多做介绍了。

    展开全文
  • memset怎么给一个整形数组赋0![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/9.gif)新人表示心好累 百度到了 好像要指针 但也有不用的,不知道标准是什么样,来问问,求解
  • 想必在C的时候难免会与数组,指针,内存这几样东西打交道,先以数组为例,例如有一个数组int a[5] = {1, 2, 3, 4, 5},我们要将数组a里面的数据复制到数组b中,一般刚刚接触C语言的我们会怎么做?我们一般会想到...
  • 下面就好好重新认识一下这个函数,自己写了测试的代码,memset到底怎么用呢? 先贴测试代码: #include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;algorithm&gt; #include&...
  • memset 是什么意思,怎么用

    千次阅读 2008-12-02 11:01:00
    功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作用 法: void *memset(void *s, char ch, unsigned n);程序例:#...
  • 请问下面代码属于C风格的吗?如果要改成C++风格的,怎么处理呢?string吗? ``` char *reqInfo = new char[10]; memset(reqInfo_, 0, 10); memcpy(reqInfo_, "12345", 6); ```
  • 想必在C的时候难免会与数组,指针,内存这几样东西打交道,先以数组为例,例如有一个数组int a[5] = {1, 2, 3, 4, 5},我们要将数组a里面的数据复制到数组b中,一般刚刚接触C语言的我们会怎么做?我们一般会想到...
  • 想必在C的时候难免会与数组,指针,内存这几样东西打交道,先以数组为例,例如有一个数组int a[5] = {1, 2, 3, 4, 5},我们要将数组a里面的数据复制到数组b中,一般刚刚接触C语言的我们会怎么做?我们一般会想到...
  • 现有一个整型数组a[5],若要是用memset函数给每个元素赋初值1怎么做呢?是memset(a,1,5*sizeof(int))吗?  其实这样是不对的,memset是以字节为单位就是对array指向的内存的4个字节进行赋值,每个都ASCII为1...
  • memset引出的问题

    2009-12-22 11:51:00
    写的那个界面显示程序里有个复位的过程,也就是把相关的数据清0,当时的是memset,忽然一想,这函数的开销怎么样,跟直接赋值,哪个效率更高?网上搜了个程序,改了改,the code:#include#include#include#include...
  • 现有一个整型数组a[5],若要是用memset函数给每个元素赋初值1怎么做呢?是memset(a,1,5*sizeof(int))吗? 其实这样是不对的,memset是以字节为单位就是对array指向的内存的4个字节进行赋值,每个都ASCII为1的字符...
  • 但是像我上面所定义uint16_t buff[4096]的话,f_read只读了一次4096字节,第二次读取的时候就返回错误09,怎么回事呢? 难道数组buff的大小会影响到 f_read函数?还是我读完之后立即把uint32_t 转 uint16_t所影响的...
  • #include "msp430x26x.h" #include "aes.h" #include #include #include int main( void ) { int i; ... unsigned char state[] = {0x00, 0x11, ...还有一个.c和.h的文件,devc++运行main函数显示没有msp430x26x.h
  • void Not_same_randnum(int randnum,int n1,int n2) //randnum:需要产生多少... //memset函数只能给字符型数组 fill(a, a + (randnum ), 0); //fill适用所有类型,给a的randnum个函数赋0值 for (int i = 0; i <.
  • 假如在这里怎么用介绍循环写,估计要被说骗点击率了。。。 首先,对于批量赋值,我们有这样的几个函数可以用 1.memset(cstring) 适用于内置数据类型数组的批量赋值,因为它是按照字节赋值的,所以对于in...
  • 说在前面:1、本帖的三个算法全部采用关系(布尔)矩阵实现,也有大佬STL模板库中的set和vector实现了,本人学完STL之后会补充set和vector的...3、本帖算法采用memset函数赋初值,如果不了解memset的使用方法的...
  • c怎么把数组初始化为0(数组很大)

    千次阅读 2014-09-14 22:04:56
    如果是初始化,只要定义第一个元素为0,后面就全为0了,如 int a[SIZE] = {0}; 如果是在定义以后想全部赋为0,用memset()函数是比较快的。 如: int a[SIZE]; memset(a, 0, sizeof(int)*SIZE);
  • //get函数,避免scanf以空格分割数据, if (filename[0]==34) filename[strlen(filename)-1]=0,strcpy(filename,filename+1); //支持文件拖曳,但会多出双引号,这里是处理多余的双引号 if (!strcmp(filename,"exit...
  • 然后逐行的读懂了这个程序,能够很顺利的运行显示出所有数据,但是我想进一步做的时候发现自己需要将没一行数据单独进行运算,而这个程序是检测后直接一个个的将一整行显示了,所以我不知道该怎么进行下一步的数据...
  • 哈希表里的值表示这个单词出现的次数,在哈希表里搜索值为1的单词,然后到wordlist里找到对应的单词输出到ret,现在主要问题好像是出在strcat这个函数这里,能否在我的这个思路的基础上修改并实现代码? #define ...
  • memset(Encryptdata, 0, sizeof(Encryptdata)) ; ReadProcessMemory(hProcess, (LPVOID)pEncrypt, Encryptdata, nBytes, &dwBytesRead) ; // 调用解密函数解密 /DecryptFunc(Encryptdata, nBytes) ; // 打印...
  • 就不知道什么函数。厂家提供的软件包里面的receive函数都需要 指定size长度。 下面的代码中,我在最开始开启SPI_IT_RXNE中断使能。 通过中断函数和数据处理函数来解析报文。并把报文上传网络服务器。 但是ARM SPI...
  • //最后一个字节补齐 //防溢出处理 sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); return ~sum; } //组织UDP数据包 int send_udp_dos(int connfd, struct sockaddr_in *paddr) { int ...
  • 手头上因为没有64位的vc编译器,只好windbg看ms自身的函数怎么样调用的。 首先看两个再熟悉不过的api,memset和CreateHeap。函数原型和使用像呼吸一样了,也不用多解释一看就明白。 调用memset(rcx, rdx, r8...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

memset函数怎么用