小心别踩到了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  阅读(1185)  评论(0)    收藏  举报