zoukankan      html  css  js  c++  java
  • memset 函数使用

    摘自百度:http://dwz.cn/aD9t9

    定义:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。


    1.需要的头文件:
     
    在C中 <string.h>
    在C++中 <cstring>
     
    2.函数介绍:
    void *memset(void *s, char ch, size_t n);

    函数解释:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。

    memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
     
    3.常见错误:
     
    第一: 搞反了 ch 和 n 的位置.
    一定要记住如果要把一个char a[20]清零,一定是 memset(a,0,20);
    而不是 memset(a,20,0);
     
    第二: 过度使用memset
    1 char buffer[20];
    2 memset(buffer,0,sizeof(char)*20);
    3 strcpy(buffer,"123");
    这里的memset是多余的. 因为这块内存马上就被覆盖了,清零没有意义.
     
    第三: 其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现
    1 int some_func(struct something *a)
    2 {
    3 4 5     memset(a,0,sizeof(a));
    6 7 }

    这里错误的原因是VC函数传参过程中的指针降级,导致sizeof(a),返回的是一个 something*指针类型大小的的字节数,如果是32位,就是4字节。


    程序范例


    1
    #include <string.h> 2 #include <stdio.h> 3 #include <memory.h> 4 5 int main(void) 6 { 7 char buffer[] = "Hello world "; 8 printf("Buffer before memset: %s ",buffer); 9 memset(buffer,'*',strlen(buffer)); 10 printf("Buffer after memset: %s ",buffer); 11 12 return 0; 13 }

    输出结果:

    Buffer before memset: Hello world
    Buffer after memset: ************

    编译平台:

    Microsoft Visual C++6.0

    也不一定就是把内容全部设置为ch指定的ASCⅡ值,而且该处的ch可为int或者其他类型,并不一定要是char类型。例如下面这样:

    1 int array[5] = {1,4,3,5,2};
    2 for(int i = 0; i < 5; i++)
    3     cout<<array[i]<<" ";
    4 cout<<endl;
    5 
    6 memset(array,0,5*sizeof(int));
    7 for(int k = 0; k < 5; k++)
    8     cout<<array[k]<<" ";
    9 cout<<endl;

    输出的结果就是:

    1 4 3 5 2
    0 0 0 0 0

    后面的表大小的参数是以字节为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小也可能不同,所以最好用sizeof()

    要注意的是,memset是对字节进行操作

    所以上述程序如果改为

    1 int array[5] = {1,4,3,5,2};
    2     for(int i = 0; i < 5; i++)
    3         cout<<array[i]<<" ";
    4     cout<<endl;
    5  
    6     memset(array,1,5*sizeof(int));// 注意 这里与上面的程序不同
    7     for(int k = 0; k < 5; k++)
    8         cout<<array[k]<<" ";
    9     cout<<endl;

    输出的结果就是:

    1 4 3 5 2
    16843009 16843009 16843009 16843009 16843009

    为什么呢?

    因为memset是以字节为单位就是对array指向的内存的4个字节进行赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是

    00000001000000010000000100000001 //表示一个int整形

    就等于16843009,就完成了对一个INT元素的赋值了。

    所以用memset对 非字符型数组 赋初值是不可取的!(字符型数组每个元素刚好占一个字节,所以赋值和最终存储的结果一致)

    例如有一个 结构体 Some x,可以这样清零:

    memset(&x,0,sizeof(Some));

    如果是一个 结构体的数组 Some x[10],可以这样:

    memset(x,0,sizeof(Some)*10);

    memset函数详细说明

    1.

    void *memset(void *s,int c,size_tn)

    总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

    2.例子

    int main()
    {
        char *s="Golden Global View";
        clrscr();
        memset(s,'G',6);//貌似这里有点问题
                          //
    单步运行到这里会提示内存访问冲突
                          //肯定会访问冲突,s指向的是不可写空间。
        printf("%s",s);
        getchar();
        return 0;
    }

    【以上例子出现内存访问冲突应该是因为s被当做常量放入程序存储空间,如果修改为 char s[]="Golden Global View";则没有问题了。】

    【应该是没有问题的,字符串指针一样可以,并不是只读内存,可以正常运行】

    3。memset() 函数常用于内存空间初始化。如:

    char str[100];
    memset(str,0,100);

    4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘memset(a,'',sizeof(a));

    5。补充:一点技巧

    memset可以方便的清空一个结构类型的变量或数组。

    如:

    1 struct sample_struct
    2 {
    3     char csName[16];
    4     int iSeq;
    5     int iType;
    6 };

    对于变量

    struct sample_strcut stTest;

    一般情况下,清空stTest的方法:

    1 stTest.csName[0]={''};
    2 stTest.iSeq=0;
    3 stTest.iType=0;

    用memset就非常方便:

    memset(&stTest,0,sizeof(struct sample_struct));

    如果是数组:

    struct sample_struct TEST[10];

    memset(TEST,0,sizeof(struct sample_struct)*10);

    另外:

    如果结构体中有数组的话还是需要对数组单独进行初始化处理的。

  • 相关阅读:
    Atitit.随时间变色特效 ---包厢管理系统的规划
    Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
    Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
    atitit.薄伽梵歌overview  attilax 读后感
    Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称
    Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称
    atitit.薄伽梵歌overview  attilax 读后感
    Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制
    Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制
    Atitit.执行cli cmd的原理与调试
  • 原文地址:https://www.cnblogs.com/zhangxiaosong/p/3323892.html
Copyright © 2011-2022 走看看