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

posted on 2012-09-28 10:31  屁屁侠  阅读(226)  评论(0编辑  收藏  举报

导航