返回首页
当前位置: 主页 > 编程语言 > C/C++教程 >

memset函数语法 用法 例子

时间:2015-08-13 22:08来源:电脑教程学习网 www.etwiki.cn 编辑:admin

该例子说明几个问题

    1. memset函数
           原型:void * memset(void *a, int val, unsigned int length);
           功能:把从a开始的length个字节都设置为值val。
           作用:在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。
           头文件: #include <string.h> 
           注意: memset是逐字节赋值的。
    2. 常见的三种错误
          (1) 搞反了val和length的位置
            一定要记住:如果要把一个char a[20]清零, 一定是 memset(a, 0, 20), 而不是 memset(a, 20,  0) 
          (2) 过度使用memset, 我想这些程序员可能有某种心理阴影, 他们惧怕未经初始化的内存, 所以他们会写出这样的代码:
                char buffer[20];
                memset(buffer, 0, sizeof(char) * 20); 
                strcpy(buffer, "123"); 
            这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义.
          (3) 其实这个错误严格来讲不能算用错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,如果有,就默认字符结束,不会输出后面的乱码)

 
测试环境vc6.0
********************************************************************/

#include <stdio.h>

#include <string.h>

 
int main(void)
{
/*  
  // char类型数组
  int i;
  char a[10];
  
  memset(a, 0, 10);
  
  for (i = 0; i < 10; i++)
    printf("%d ", a[i]);

 
  printf("\n");
*/

 
/*
  // char类型数组中所有元素都设置成1  
  int i;
  char a[10];

 
  memset(a, 1, 10);

 
  for (i = 0; i < 10; i++)
    printf("%d ", a[i]);

 
  printf("\n");
*/

 
/*  
  // int类型数组中所有元素都设置成1,却是不可行的
  int i;
  int a[5];

 
  memset(a, 1, 5 * sizeof(int));

 

 
  for (i = 0; i < 5; i++)
    printf("%#X ", a[i]);

 
  printf("\n");
*/

 

 
  // 使用memset在给char以外的数组赋值时,只能初始化为0或者-1。
  char i;
  int a[10];

 
  memset(a, -1, 10 * sizeof(int));

 
  for (i = 0; i < 9; i++)
    printf("%d ", a[i]);

 
  printf("\n");

 

 
  return 0;
}
/*********************************************************************
0 0 0 0 0 0 0 0 0 0
Press any key to continue

 

 
1 1 1 1 1 1 1 1 1 1
Press any key to continue

 

 
0X1010101 0X1010101 0X1010101 0X1010101 0X1010101
Press any key to continue

 

 
-1 -1 -1 -1 -1 -1 -1 -1 -1
Press any key to continue
*********************************************************************/

 

 
/*********************************************************************
例1:
     char str[9];
     用memset给str初始化为{0 0 0 0 0 0 0 0},用法如下
     memset(str,0,8);
     输出:
          0 0 0 0 0 0 0 0 -52(任意的)

 
例2:
     int num[8];
     用memset给num初始化为{1,1,1,1,1,1,1,1},用法如下
     memset(num, 1, 8);  // error
       
     一个int是4个字节的,8个int是32个字节,所以首先要赋值的长度就不应该为8而是32。
     因为memset是 逐字节 拷贝,以num为首地址的8字节空间都被赋值为1,
     即一个int变为0X00000001 00000001 00000001 00000001,显然,把这个数化为十进制不会等于1的。

 
     所以,在memset使用时要千万小心,在给char以外的数组赋值时,只能初始化为0或者-1。
     因为在计算机里,0的二进制都是0,-1的二进制都是1。
------分隔线----------------------------
标签(Tag):C语言
------分隔线----------------------------
推荐内容
猜你感兴趣