zoukankan      html  css  js  c++  java
  • C/C++中memset函数

    本文学习参考http://baike.baidu.com/link?url=ZmSyY8ciB_nJt9KM-W2fiEFJrC2mugFsLqRdY2b4pLe8rD_jRXyN7_pj0GBBD2bKyt6Xm-lpUlAO97H94dUYXa

    1.memset函数的声明和含义如下:

    函数解释:将s所指向的某一块内存中的前n个字节的内容全部设置为 ch 指定的 ASCII值, 第一个值为指定的内存地址块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。该函数对数组而言只能用于数组的置0或-1,其他值无效。其作用是在一段内存块中填充某个给定的值,它是对较大的结构体或者数组进行清零操作的一种最快方法。函数声明如下:

    void * memset(void *s, int ch, size_t n);

    memset 函数而已用于初始化内存,例如:

    char str[100];
    memset(str,0,100);

     2.memset函数的常见错误用法

    (1)memset函数对数组而言,只能进行置0或者置(-1)操作,而不能是其他的数值

      因为memset函数是对单个字节进行操作,如果将int a[5]值为2,操作为:memset(a,2,sizeof(int)*5);因为他是整型数组,有四个字节,而每个字节都被赋值为2,即a[5]中的每个元素的每个字节都被赋值为2(例如a[0]的二进制表示为00000010 00000010 00000010 00000010   , 所以输出十进制a[0]的值为 33686018);而(-1)的二进制表示为(11111111 11111111 11111111 11111111),因此置为(-1)不会改变其值。

    (2)memset(void *s, int key,size_t n) 中ch实际范围应该在0~~255。

    (3)注意ch 和 n 的位置不能弄反

    3.memset的使用情形比较

    例如:将 char a[20] 进行清零的操作如下

    memset(a,0,20*sizeof(char));      //将char a[20] 清零

    (1)两种情况下使用memset函数的比较

    char buffer[4];
    memset(buffer,0,sizeof(char)*4);                //将buffer[4] 清零
    strcpy(buffer,"123");                    //将字符串 “123” 复制到 buffer中
    
    //此时字符串的总长为4位(包括结尾的 ‘’ )
    //因为拷贝的字符串将buffer全部覆盖,因此,此时的memset可以不需要
    char buffer[20];
    memset(buffer,0,sizeof(char)*20);
    memcpy(buffer,"123",3);
    //这一条的memset并不多余,memcpy并没把buffer全部覆盖,如果没有memset,
    //用printf打印buffer会有乱码甚至会出现段错误。
    //如果此处是strcpy(buffer,"123");便不用memset,
    //strcpy虽然不会覆盖buffer但是会拷贝字符串结束符

    (2)Demo如下:

    #include <iostream>
    using namespace std;
    
    int main(void)
    {
        char buffer[] = "Helloworld
    ";
        cout << "Buffer before memset: " << buffer << endl;
        memset(buffer, '*', strlen(buffer));
        cout << "Buffer after memset: " << buffer << endl;
        system("pause");
        return 0;
    }

    result:

    PS:关于内存访问冲突问题

    #include <iostream>
    using namespace std;
    int main()
    {
        char *s="GoldenGlobalView";        //改为char s[] = "GoldenGlobalView";则没有问题
        memset(s,'G',6);                     //单步运行到这里会提示内存访问冲突
        printf("%s",s);
        getchar();
        return 0;
    }

  • 相关阅读:
    JavaScript For, While和 递归
    adb 常用命令
    Android 测试 之adb shell
    Android测试入门学习
    Android 测试之Monkey
    Linux大全
    Android 测试 之MonkeyRunner
    手机耗电测试工具
    https双向认证网站搭建
    Mac下布置appium环境
  • 原文地址:https://www.cnblogs.com/runningRain/p/5930249.html
Copyright © 2011-2022 走看看