zoukankan      html  css  js  c++  java
  • memset用法详解(转)

    问题描述:

    int * cow = new int[n+1];

    memset(cow,0,(n+1)*4);

    将N+1个元素置成0,为什么不行

    memset是对一个字节的int4个字节,因此*4

    但是只能为0,其他例如1就不可以,详见最后一个例子

    memest原型 (please type "man memset" in your shell) 

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

    memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。

    常见的三种错误

    第一: 搞反了c 和 n的位置. 

    一定要记住 如果要把一个char a[20]清零, 一定是 memset(a, 0, 20) 

    而不是 memset(a, 20,  0) 

    第二: 过度使用memset, 我想这些程序员可能有某种心理阴影, 他们惧怕未经初始化的内存, 所以他们会写出这样的代码: 

    char buffer[20]; 

    memset(buffer, 0, sizeof((char)*20)); 

    strcpy(buffer, "123"); 

    这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义. 

    第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现 

    int some_func(struct something *a){ 

     … 

     … 

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

     … 

    问:为何要用memset置零?memset( &Address, 0, sizeof(Address));经常看到这样的用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。

    答:1.如果不清空,可能会在测试当中出现野值。 你做下面的试验看看结果() 

    char buf[5]; 

    CString str,str1; //memset(buf,0,sizeof(buf)); for(int i = 0;i< 5;i++) { str.Format(“%d “,buf[i]); str1 +=str ; } TRACE(“%s/r/n“,str1)

    2.其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)

    问:

    如下demo是可以的,能把数组中的元素值都设置成字符1,

    #include <iostream>

    #include <cstring>

    using namespace std;

    int main()

    {

        char a[5];

        memset(a,'1',5);

        for(int i = 0;i < 5;i++)

          cout<<a[i]<<"  ";

        system("pause");

        return 0;

    }

    而,如下程序想吧数组中的元素值设置成1,却是不可行的

    #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;

    }

    问题是:

    1,第一个程序为什么可以,而第二个不行,

    2,不想要用for,或是while循环来初始化int a[5];能做到吗?(有没有一个像memset()这样的函数初始化)

    答:

    1.因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样? 

    2.如果用memset(a,1,20);

    就是对a指向的内存的20个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是1000000010000000100000001,就等于 16843009,就完成了对一个INT元素的赋值了。

    源文档 <http://www.diybl.com/course/3_program/c++/cppjs/20090409/164680.html>

  • 相关阅读:
    Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task(枚举/最大连续子序列)
    Educational Codeforces Round 88 (Rated for Div. 2) A. Berland Poker(数学)
    Educational Codeforces Round 88 (Rated for Div. 2) E. Modular Stability(数论)
    Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water(数学/二分)
    Codeforces Round #644 (Div. 3)
    Educational Codeforces Round 76 (Rated for Div. 2)
    Educational Codeforces Round 77 (Rated for Div. 2)
    Educational Codeforces Round 87 (Rated for Div. 2)
    AtCoder Beginner Contest 168
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5915151.html
Copyright © 2011-2022 走看看