zoukankan      html  css  js  c++  java
  • memset与初始化

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

    PS:当然,也有个别例外的。比如strtol函数中的第二个参数,对于这个参数,我们只需要定义一个字符指针变量,并且不需要赋初值,然后将字符指针的地址放到strtol函数的第二个参数即可。参考:https://www.cnblogs.com/cyx-b/p/12491043.html

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

    #include <string.h>
    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。

    在网络编程中,常常有各种各样花里胡哨的结构体,因此常会用memset来初始化。

    比如下面这个例子:

    struct sockaddr_in ServerAddr;
    ServerAddr.sin_family = AF_INET;    //IPV4
    ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);   //IP地址
    ServerAddr.sin_port = htons(PORT);    //端口号
    memset(ServerAddr.sin_zero, 0x00, 8);   //零填充

    或者也可以像下面这样:

    struct sockaddr_in ServerAddr;
    memset(&ServerAddr, 0, sizeof(ServerAddr));
    ServerAddr.sin_family = AF_INET;
    ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
    ServerAddr.sin_port = htons(PORT);

    PS:关于sockaddr_in可以参考https://www.cnblogs.com/cyx-b/p/12450811.html

  • 相关阅读:
    编程浪子我的个人知识树
    JAVA基本数据类型
    JS导出数据为表格-csv
    table表格打印样式
    ENTER键指定事件
    legend生成表单边框效果
    js按拼音排序算法
    CommonJs规范
    iscroll在安卓高版本(6.0以上)某些机型上滑动卡顿问题的解决方法
    前端常见报错原因详解
  • 原文地址:https://www.cnblogs.com/cyx-b/p/12515910.html
Copyright © 2011-2022 走看看