memset函数越界分析

来源:互联网 发布:淘宝店铺的升级专业版 编辑:程序博客网 时间:2024/06/03 14:18

一、memset()函数原型
    将buffer所指向的某一块内存中的前count个字节的内容全部设置为c指定的ASCII值

extern void *memset(void *buffer, int c, int count)        {      const unsigned char uc = c;      unsigned char *su;      for(su = buffer;0 < count;++su,--count)      *su = uc;      return buffer;  }  
    buffer:为指针或是数组,
    c:是赋给buffer的值,
    count:是buffer的长度.

二、函数使用
    memset可以清空一个结构体
struct sample_struct{char csName[16];int iSeq;int iType;};struct sample_strcut stTest;memset(&stTest,0,sizeof(struct sample_struct));
    如果是数组:
struct sample_struct TEST[10];
memset(TEST,0,sizeof(struct sample_struct)*10);

三、注意
  1. memset是以字节为单位初始化内存块。
char data[10];  memset(data, 1, sizeof(data));    // right  memset(data, 0, sizeof(data));    // right int data[10];  memset(data, -1, sizeof(data));    // right  memset(data, 1, sizeof(data));    // wrong, data[x] be 0x0101 
 2. 当结构体中包含指针时,在使用memset时需要小心。
struct Parameters {            int* p_x;  };  Parameters par;  memset(&par, 0, sizeof(par));  
    当memset初始化时,会把p_x指针本身设置为0。
  3.这里的memset是多余。
char buffer[20];
memset(buffer,0,sizeof(char)*20);
strcpy(buffer,"123");
//以下并不多余
memset(buffer,0,sizeof(char)*20);
memcpy(buffer,"123",3);


0 0
原创粉丝点击