• 【字符串】memset函数及其用法


    在前面不知一次说过,定义变量时一定要初始化,尤其是数组和结构体这种占用内存大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫”这样的野值,俗称“乱码”。

    每种类型的变量都有各自的初始化方法,memset()函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存(memory)”的的意思。该函数的原型为:

    1 #include<string.h>
    2 void *memset(void *s,int c,unsigned long n);

    函数的功能是:将指针变量s所指向的前n字节的内存单元用一个“整数”c替换,注意c是int型。s是void*型的指针变量,所以它可以为任何类型的数据进行初始化。

    memset()的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。

    memset一般使用“0”初始化内存单元,而且通常是给数组或结构体进行初始化。一般的变量如char、int、float、double等类型的变量直接初始化即可,没有必要使用使用memset。如果用memset的话反而显得麻烦。

    当然,数组也可以直接进行初始化,但memset是对较大的数组或结构体进行清零初始化的最快方法,因为它是直接对内存进行操作的。

    这时有人会问:“字符串数组不是最好用''进行初始化吗?那么可以用 memset 给字符串数组进行初始化吗?也就是说参数 c 可以赋值为''吗?”

    可以的。虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 '' 和 0 是等价的,因为字符 '' 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 '' 的作用,所以通常我们就写“0”。

    memset 函数的第三个参数 n 的值一般用 sizeof()  获取,这样比较专业。注意,如果是对指针变量所指向的内存单元进行清零初始化,那么一定要先对这个指针变量进行初始化,即一定要先让它指向某个有效的地址。而且用memset给指针变量如p所指向的内存单元进行初始化时,n 千万别写成 sizeof(p),这是新手经常会犯的错误。因为 p 是指针变量,不管 p 指向什么类型的变量,sizeof(p) 的值都是 4。

     1 #include<stdio.h>
     2 #include<string.h>
     3 int main(void)
     4 {
     5     int i;//循环变量
     6     char str[10];
     7     char *p=str;
     8     memset(str,0,sizeof(str));//只能写sizeof(str),不能写sizeof(p)
     9     for (i=0;i<10;i++)
    10     {
    11         printf("%dx20",str[i]);
    12     }
    13     printf("
    ");
    14     return 0;
    15 }

    根据memset函数的不同,输出结果也不同,分为以下几种情况:

    memset(p, 0, sizeof(p));  //地址的大小都是4字节  0 0 0 0 -52 -52 -52 -52 -52 -52

    memset(p, 0, sizeof(*p));  //*p表示的是一个字符变量, 只有一字节  0 -52 -52 -52 -52 -52 -52 -52 -52 -52

    memset(p, 0, sizeof(str));0 0 0 0 0 0 0 0 0 0

    memset(str, 0, sizeof(str)); 0 0 0 0 0 0 0 0 0 0

    memset(p, 0, 10);  //直接写10也行, 但不专业  0 0 0 0 0 0 0 0 0 0

     
  • 相关阅读:
    jquery 一键复制文本到剪切板
    C#根据当前时间获取周,月,季度,年度等时间段的起止时间
    Asp.Net : Page.RegisterStartupScript及 不执行的原因
    mysql 查询当天、本周,本月,上一个月的数据
    ASP.NET: Cookie会话丢失,Session超时配置
    SQL :“传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确” 错误
    JS:Math 对象方法
    ASP.NET上传文件到远程服务器(HttpWebRequest)
    Javascript 使用postMessage对iframe跨域传值或通信
    C#中out和ref之间的区别
  • 原文地址:https://www.cnblogs.com/Luthais/p/10178162.html
Copyright © 2020-2023  润新知