小心别踩到了memset的坑

memset

标签(空格分隔): 未分类


详解memset用法,不要掉坑里了

原型:void * memset ( void * ptr, int value, size_t num );

memset主要应用场景:

  • 对某个一维(二维)数组或结构体进行清0处理

  • 将某一个字符赋值给字符数组(注意不能够赋值一个int类型甚至double类型数字:因为memset函数本身就是按char类型字节大小进行赋值)

  • 实现一维(二维)bool数组的置false和置true

      char a[10];
      // 清0一个字符数组
      memset(a, 0, sizeof(a));
      // 0——strlen是计算第一个'\0'之间的字符数
      cout << strlen(a) << endl;
      
      memset(a, '1', sizeof(a));
      // 输出10个1
      for (int i = 0; i < strlen(a); i++)
          cout << a[i] << " ";
      
      int a[10];
      // 清0一个int数组
      memset(a, 0, sizeof(a));
      // 输出10个0
      for (int i = 0; i < sizeof(a)/sizeof(int); i++)
          cout << a[i] << " ";
      
      // 无效做法
      int a[10];
      memset(a, 1, sizeof(a));
      // 输出10个16843009
      for (int i = 0; i < sizeof(a)/sizeof(int); i++)
          cout << a[i] << " ";
      
      bool a[10];
      // a里面的值都是false
      memset(a, 0, sizeof(a));
      // a里面的值都是true——原因很简单,bool类型除了几个特殊的代表false的元素(NULL, 0, ...)之外都是true
      memset(a, 1, sizeof(a));
      
      // 清空一个结构体里面的数据内容
      struct student {
          int num;
          int otherNum;
          char myStr;
      };
      student myStu[10];
      // 清空一个具体的某个结构体
      memset(&mystu[0], 0, sizeof(struct student));
      for (int i = 0; i < 10; i++) {
          myStu[i].num = 1000;
          myStu[i].otherNum = 1000;
          myStu[i].myStr = '9';
      }
      // 清空一个结构体数组所有数据内容
      memset(myStu, 0, sizeof(myStu));
    

    一个常犯的错误

      bool* a = new bool[100];
      memset(a, 0, sizeof(a));
      // 由于这里a不是一个数组,而仅仅是一个指针,所以sizeof(a)的大小仅仅是8(假设在64位操作系统中)
    

    实现清零的其他简便操作

      // 置零int,char,bool一维数组均可
      int a[10] = {};
      bool a[10] = {};
      char a[10] = {};
    

没有演示二维数组的情况,但是和一维数组的清零操作基本一样

以上纯属个人理解,难免会有错误,如果有错,请各位大神指点~
posted @ 2016-12-09 17:30  Perdon  阅读(1136)  评论(0)    收藏  举报