• memset用法


    http://www.cnblogs.com/lebronjames/archive/2010/07/04/1770987.html

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

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

    //========================================================

    #include <stdio.h>
    #include <string.h>

    int main(int argc, char **argv)
    {

        char buffer[] = "Hello World!\n";

        printf("Buffer before memset:%s\n", buffer);

        memset(buffer, '*', strlen(buffer));

        printf("Buffer after memset:%s\n", buffer);

        return 0;
    }
    //=============================================

    #include <stdio.h>
    #include <string.h>
    #define SIZE 5

    int main(int argc, char **argv)
    {

        int i;

        int array[SIZE] = { 1, 2, 3, 4, 5 };

        for(i = 0; i < SIZE; i++)
        {
            printf("=before==%d===\n", array[i]);
        }

        memset(array, 1, SIZE*sizeof(int));

        for(i = 0; i < SIZE; i++)
        {
            printf("=after==%d===\n", array[i]);
        }

        return 0;
    }

    输出的结果就是:   

    1 4 3 5 2   

    16843009 16843009 16843009 16843009 16843009   

    因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是 00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于 16843009,就完成了对一个INT元素的赋值了。   所以用memset对非字符型数组赋初值是不可取的!  

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

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

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

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

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

    //=============================================

    #include <stdio.h>
    #include <string.h>

    int main(int argc, char **argv)
    {

        char buffer[] = "Hello World!\n";

        //char *buffer = "Hello World!\n";错误

        printf("Buffer before memset:%s\n", buffer);

        memset(buffer, '*', 6);

        printf("Buffer after memset:%s\n", buffer);

        return 0;
    }
      

     //========================================================

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

    如:   

    char str[100];   

    memset(str,0,100);   

    memset()的深刻内涵:

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

    //=======================================================================

    memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;

    例:   

    char a[100], b[50];   

    memcpy(b, a, sizeof(b));

    //注意如用sizeof(a),会造成b的内存地址溢出。   

    strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;

    例:   

    char a[100], b[50];   

    strcpy(a,b);   

    如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。  

    //======================================================================= 

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

    如:   

    struct sample_struct   

    {   

    char csName[16];   

    int iSeq;   

    int iType;   

    };   

    对于变量  

    struct sample_strcut stTest;   

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

    stTest.csName[0]='\0';   

    stTest.iSeq=0;   

    stTest.iType=0;   

    用memset就非常方便:   

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

    如果是数组:   

    struct sample_struct TEST[10];   

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

  • 相关阅读:
    bzoj1027
    bzoj1069
    poj2079
    poj2187
    bzoj2281
    bzoj2285
    bzoj1558
    bzoj1822
    bzoj1559
    bzoj1570
  • 原文地址:https://www.cnblogs.com/liulipeng/p/2706774.html
Copyright © 2020-2023  润新知