精华内容
下载资源
问答
  • memset函数简析功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作 用 法: void *memset(void *s, char ch, unsigned n...

    memset函数简析

    功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,
    块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作
    
    用 法: void *memset(void *s, char ch, unsigned n);
    
    对比:
    memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
    
    strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

    memset:char型初始化函数

    头文件: 或

    函数原型:void memset(void s , int ch , size_t n )

    memset(结构体/数组名 , 用于替换的ASCII码对应字符 , 前n个字符 );
    
    memset(结构体/数组名 , "用于替换的字符“ , 前n个字符 );
    
    函数解释:将s中的前n个字节用ch替换并且返回s
    
    函数作用:在一段内存块中填充某一个给定的值,常用于较大的对结构体和数组的清零操作。
    //例1
    #include<iostream>
    //#include"string.h"
    using namespace std;
    int main()
    {
        char str[10];
        str[9] = 'w';
        memset(str,97,9);
        for(int i=0;i<10;i++){
            cout<<str[i]<<" ";
        }
        return 0;
    }

    输出:a a a a a a a a a w

    说明:使用memset似乎不需要使用额外的头文件。

    //例2
    #include<iostream>
    //#include"string.h"
    using namespace std;
    int main()
    {
        char str[10];
        str[9] = 'w';
        memset(str,97,sizeof(char)*10);
        for(int i=0;i<10;i++){
            cout<<str[i]<<" ";
        }
        return 0;
    }
    

    输出:a a a a a a a a a a

    #include<iostream>
    using namespace std;
    int main()
    {
        char str[10];
        memset(str,65,sizeof(str)-3);
        for(int i=0;i<10;i++){
            cout<<str[i]<<" ";
        } 
        return 0;
    }
    

    *输出:A A A A A A A *


    若你对人工智能(CV/NLP)、C++/python编程、互联网就业及发展有兴趣,欢迎点赞关注和收藏。谢谢鼓励!!!

    C++相关知识:

    Anxjing.AI:C++ this_thread::sleep_forzhuanlan.zhihu.com
    9591689ead250961aaeb861b122213d1.png
    Anxjing.AI:C++ Lambda表达式zhuanlan.zhihu.com
    6a5ed2893052857a0f04e623f38df51c.png
    Anxjing.AI:C++并发_condition_variablezhuanlan.zhihu.com
    a71dcaf7e9a8a23d947fc1b2e0353339.png
    Anxjing.AI:生产者-消费者模型zhuanlan.zhihu.com
    96c9e357adea8eb897092ea2b676e427.png
    Anxjing.AI:C++预处理指令zhuanlan.zhihu.com
    e1c6f24f84d58c66f09a06ac34888610.png
    Anxjing.AI:C++工具:Cmakezhuanlan.zhihu.com
    881fae5235e17fe249b241e0fdb0ed86.png
    Anxjing.AI:SSH 学习zhuanlan.zhihu.com
    e1cde0f4167caa64bb26bbf66be8d875.png
    Anxjing.AI:记录C++阶段性学习一zhuanlan.zhihu.com
    a439213ddd66914d79d151fdbcf94750.png
    Anxjing.AI:DesignPatterns C++:单例模式zhuanlan.zhihu.com
    1f43de206b62febdfa895c5feb0a2653.png
    Anxjing.AI:C++基础:map简析zhuanlan.zhihu.com
    72f10b80c3099c24049ff2b805e1a856.png
    Anxjing.AI:C++基础:memset函数简析zhuanlan.zhihu.com
    069b58927e7d348b508b17b13e986969.png
    Anxjing.AI:C++基础:break&continue区别zhuanlan.zhihu.com
    0bf0af359db96c18092d3e9db00bec99.png
    Anxjing.AI:C++基础:指针和引用的区别zhuanlan.zhihu.com
    55dc4962afebb93b2cb4b7f90143ba10.png
    Anxjing.AI:C++中::和:, .和->的作用和区别?zhuanlan.zhihu.com
    70a5f14e5a88aeb7a3806575fd1c7e26.png
    Anxjing.AI:string中c_str()的使用方法和特性zhuanlan.zhihu.com
    72f10b80c3099c24049ff2b805e1a856.png
    Anxjing.AI:C ++ strcpy()和strncpy()函数zhuanlan.zhihu.com
    f7d510d8457d798a104c205cd8eabf9c.png
    Anxjing.AI:C++基础-关键字virtualzhuanlan.zhihu.com
    6bfe90dfd32b581e0c2aa77142a773d0.png
    Anxjing.AI:C++基础-函数重载zhuanlan.zhihu.com
    bb737cc100a7552c4167bd188051a58a.png
    Anxjing.AI:C++基础-staticzhuanlan.zhihu.com
    0d407d647ffbd40acc4396cf2ce115ef.png
    Anxjing.AI:C++基础:判断文件是否存在的方法zhuanlan.zhihu.com
    6a826ab4efd1b5243f657909939efac3.png
    Anxjing.AI:C++基础-strstr查找子串zhuanlan.zhihu.com
    9510f3f9d0cee644fb8a6be402c412d1.png
    Anxjing.AI:C++基础:std::thread多线程zhuanlan.zhihu.com
    2f868c3af6bbe7d0fea9e5fbf12abd18.png
    展开全文
  • 起因】希望对各种类型的数组进行初始化,避免野值memset函数将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为...

    起因】希望对各种类型的数组进行初始化,避免野值

    memset函数将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。

    【函数头文件】

    0818b9ca8b590ca3270a3433284dd417.png提示:在linux中可以在terminal中输入 "man memset"进行查询

    #include

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

    【使用说明】 The  memset()  function  fills  the  first  n  bytes of the memory area  pointed to by s with the constant byte c.

    【错误用法】

    int array[10];

    memset(array,1,10);//或者memset(array,1,sizeof(array)),都是不对的!

    【解释】

    之前一直不明白为什么memset这个函数的头文件是 "string.h",看完下面的内容,你就会明白了。

    memset函数使用说明中提到的是按照byte来填充。

    举例来说

    char arr[10]; memset(arr,'a',10);

    由于char只占一个字节(byte),因此函数的结果是将连续的10个字节都填充为'a'。这是我们所期待的结果!

    int arr[10];memset(arr,1,10);

    由于int占4个字节(byte),因此"1"对应的二进制(32bits下)为"00000000000000000000000000000001"(4bytes),塞到1byte(8bit)的中,高位被舍弃了。所以,填入数组中的值是"00000001"。然而总共有10*4=40个byte,却只有10个byte被填充,因此结果是"00000001……00000001**********"(前面总共10个"00000001")。因此,第一个数是"0x01010101"=16843009(10进制),数组其余部分的值则是随机值,读取出来会是很离谱的数!

    有人说,可以这样memset(arr,1,sizeof(arr));

    其实这样做,就是将数组的所有值都填充为"0x01010101",也就是int数组的初始值变为了16843009!这确实有点出乎我们的预料!

    【正确用法】

    方法一:可以用任何值来初始化char数组!比如 memset(arr,'a',10);

    方法二:可以用"0"来初始化任何类型数组!比如 memset(arr,0,sizeof(arr));//arr可以是char或int等类型数组!

    【小结】版权所有,如有转载请注明出处:blog.csdn.net/whuslei

    不难看出为什么memset在"string.h"头文件中声明了,因为他是以byte为单位来处理的,而char正好是一个byte!

    用"0"来初始化数组时,要初始化的长度最好用sizeof(arr)来计算,这样避免出错!是不是很强大?

    当然,并非任何时候都需要初始化!详情请参考http://www.cublog.cn/u1/49221/showart_422256.html

    程序例

    #include

    #include

    #include

    int main(void)

    {

    char buffer[] = "Hello world/n";

    printf("Buffer before memset: %s/n", buffer);

    memset(buffer, '*', strlen(buffer) );

    printf("Buffer after memset: %s/n", buffer);

    return 0;

    }

    输出结果:

    Buffer before memset: Hello world

    Buffer after memset: ***********

    编译平台:   Microsoft Visual C++ 6.0

    也不一定就是把内容全部设置为ch指定的ASCII值,而且该处的ch可为int或者其他类型,并不一定要是char类型。

    例如下面这样:

    int array[5] = {1,4,3,5,2};

    for(int i = 0; i < 5; i++)

    cout<

    cout<

    memset(array,0,5*sizeof(int));

    for(int k = 0; k < 5; k++)

    cout<

    cout<

    输出的结果就是:

    1 4 3 5 2

    0 0 0 0 0

    后面的表大小的参数是以字节为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小也可能不同,所以最好用sizeof()。

    要注意的是,memset是对字节进行操作 , 所以上述程序如果改为 :

    int array[5] = {1,4,3,5,2};

    for(int i = 0; i < 5; i++)

    cout<

    cout<

    memset(array,1,5*sizeof(int));

    // 注意 这里与上面的程序不同

    for(int k = 0; k < 5; k++)

    cout<

    cout<

    输出的结果就是:

    1 4 3 5 2

    16843009 16843009 16843009 16843009 16843009

    为什么呢 因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用 ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是 00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。

    展开全文
  • memset函数简析功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作 用 法: void *memset(void *s, char ch, unsigned n...

    memset函数简析

    功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,
    块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作
    
    用 法: void *memset(void *s, char ch, unsigned n);
    
    对比:
    memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
    
    strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

    memset:char型初始化函数

    头文件: 或

    函数原型:void memset(void s , int ch , size_t n )

    memset(结构体/数组名 , 用于替换的ASCII码对应字符 , 前n个字符 );
    
    memset(结构体/数组名 , "用于替换的字符“ , 前n个字符 );
    
    函数解释:将s中的前n个字节用ch替换并且返回s
    
    函数作用:在一段内存块中填充某一个给定的值,常用于较大的对结构体和数组的清零操作。
    //例1
    #include<iostream>
    //#include"string.h"
    using namespace std;
    int main()
    {
        char str[10];
        str[9] = 'w';
        memset(str,97,9);
        for(int i=0;i<10;i++){
            cout<<str[i]<<" ";
        }
        return 0;
    }

    输出:a a a a a a a a a w

    说明:使用memset似乎不需要使用额外的头文件。

    //例2
    

    输出:a a a a a a a a a a

    #include

    *输出:A A A A A A A *


    若你对人工智能(CV/NLP)、C++/python编程、互联网就业及发展有兴趣,欢迎点赞关注和收藏。谢谢鼓励!!!

    C++相关知识:

    Anxjing.AI:C++ this_thread::sleep_forzhuanlan.zhihu.com
    dde3f8a9b6784a900e8482dd7e1590f7.png
    Anxjing.AI:C++ Lambda表达式zhuanlan.zhihu.com
    3a06077ab88871b29257453f6b1c405c.png
    Anxjing.AI:C++并发_condition_variablezhuanlan.zhihu.com
    cec9de46a2bb04478584ee074950184a.png
    Anxjing.AI:生产者-消费者模型zhuanlan.zhihu.com
    c9218cf2cdb62ed0cae4cf3395097087.png
    Anxjing.AI:C++预处理指令zhuanlan.zhihu.com
    94f7689cd986b92396354bf0b65a71ff.png
    Anxjing.AI:C++工具:Cmakezhuanlan.zhihu.com
    5bbb995914089662243e7e063ab05692.png
    Anxjing.AI:SSH 学习zhuanlan.zhihu.com
    7dbfcd612494948520a2e18d85670a9d.png
    Anxjing.AI:记录C++阶段性学习一zhuanlan.zhihu.com
    a7dc2767a8edd329044da340d60bd794.png
    Anxjing.AI:DesignPatterns C++:单例模式zhuanlan.zhihu.com
    39eb25012d2a61667a9313e73e454e40.png
    Anxjing.AI:C++基础:map简析zhuanlan.zhihu.com
    b3e0ea60e07df5d42e2f2ba6830af96e.png
    Anxjing.AI:C++基础:memset函数简析zhuanlan.zhihu.com
    a34dca6ac126ededda298c66608f2ef7.png
    Anxjing.AI:C++基础:break&continue区别zhuanlan.zhihu.com
    07e54f8f22abef2b902ff065c69fe694.png
    Anxjing.AI:C++基础:指针和引用的区别zhuanlan.zhihu.com
    c46cc4afdb36f8b5940d25383fccc415.png
    Anxjing.AI:C++中::和:, .和->的作用和区别?zhuanlan.zhihu.com
    fa592f4ef45ccbf78933146887f9dec1.png
    Anxjing.AI:string中c_str()的使用方法和特性zhuanlan.zhihu.com
    b3e0ea60e07df5d42e2f2ba6830af96e.png
    Anxjing.AI:C ++ strcpy()和strncpy()函数zhuanlan.zhihu.com
    e13cb348b01688a7f76c82b869de4fa5.png
    Anxjing.AI:C++基础-关键字virtualzhuanlan.zhihu.com
    2f5a55bc0da6999d217a023e698552df.png
    Anxjing.AI:C++基础-函数重载zhuanlan.zhihu.com
    616b0a5fadd02418fd229645305e734a.png
    Anxjing.AI:C++基础-staticzhuanlan.zhihu.com
    43e8bae70c7cf8b172da0d0af31a81d2.png
    Anxjing.AI:C++基础:判断文件是否存在的方法zhuanlan.zhihu.com
    8ec04641dad8d5bd877d7663b98a6fe3.png
    Anxjing.AI:C++基础-strstr查找子串zhuanlan.zhihu.com
    e87bd8d07a5801cf155a0810c0409f7b.png
    Anxjing.AI:C++基础:std::thread多线程zhuanlan.zhihu.com
    a4d22637fb7fdd94118622bac117f179.png
    展开全文
  • memset函数

    2014-08-25 06:27:22
    memset 函数 头文件: string.h 函数sheng ming
    memset 函数

    头文件: string.h

    函数声明 : void *memset(void *s,int c,int n);

    函数的原理 : 将s 指向内存中的某一块大小为n的字节都变成c的ASCII的数值,内存的大小由第三个变量n指定,这个函数主要是为了新申请的内存做初始化.

    注:初始化的时候,这个函数是把每一块字节都变成c的ASCII的数值.


    经常出现的错误:
    1.memset(buffer,0,sizeof(buffer));
    有人经常把,ch和n的位置弄错了.

    2.过度的使用内存
    memset(buffer,0,sizeof(buffer));
    strcpy(buffer,"123");
    ...........很显然,memset这个函数是多余的,不需要这样做,无论怎么样的赋值,都会被覆盖的.

    3.忘记加memset函数
    memset(buffer,0,sizeof(buffer));
    memcpy(buffer,"123",3)..............void *memcpy(void *dest,const void *src,size_t n);
    ............这个就不不是多余的,这要看 memcpy和strcpy这两个函数的不同点了,
    简单的说就是这两个函数,一个是以字节赋值的,一个是拷贝字符串的字面值的.


    4.memset为函数的形式参数进行初始化
    void one_memset(char *p_ch){
    .....
    memset(p_ch,0,sizeof(p_ch));
    .....
    }.
    ........尽管我们想得很好,要给传进的字符串初始化,但是这样的初始化是不行的.
    因为在vc中,指针降级的原因.最后给出的大小只是一个指针的大小.


    5.不同类型的数组使用memset的结果是不一样的
    int main(void){
           char ch[10] ;
           memset(ch,1,sizeof(ch));
    }

    int main(void){
           int a[10];
           memset(a,1,sizeof(a));
    }

    这两个结果是不一样的,使用的时候要注意,很多人在使用,memset函数的时候以为这个函数能为任何类型的数组赋值的,但是其实他的本质就是
    通过字节来赋值的,由于字符类型的数组每一个元素都是一个字节,这样就正好给他进行了初始化,但是一个整形的数组每一个元素都是四个字节,
    这样在初始化的时候,就会出现错误,结果就会变成一个很大的数字.


    6.最不应该干这样使用memset函数
    /*
        memset函数的测试
    */
    #include<stdio.h>
    #include<string.h>

    int main(){
        char *s1 = "hello wrold!";
        printf("s1 = %s\n",s1);
        memset(s1,0,8);
        printf("s1 = %s\n",s1);
        return 0;
    }
    .......简单的说,指针指向只读区,只读区是不能改变的,如果改变就会出现段错误.
    .......但是指针的本身存在于栈区.


    拓展:
    memset还是可以给一个结构体进行初始化的,


    typedef struct node{
          int num;
          char ch[16];
    }node;

    一般进行的初始化
    node node1;
    node1.num = 0;
    node1.ch = {};

    使用memset函数
    /*
        memset函数的使用和练习
    */
    #include<stdio.h>
    #include<string.h>

    typedef struct node{
        int num;
        char ch[10];
    }node;

    int main(){
        node node_test;
        memset(&node_test,0,sizeof(node));
        printf("num = %d\n",node_test.num);
        printf("ch = %s\n",node_test.ch);
        return 0;
    }



    如果使用的是一个结构体的数组
    /*
        memset函数的使用和练习
    */
    #include<stdio.h>
    #include<string.h>

    typedef struct node{
        int num[10];
        char ch[10];
    }node;


    int main(){
        int i = 0,j = 0;
        node node_test[10];
        memset(node_test,0,sizeof(node)*10);
        for(i = 0;i < 10;i++){
            printf("ch = %s\n",node_test[i].ch);
            for(j = 0;j < 10;j++){
                printf("%d ",node_test[i].num[j]);
            }
            printf("\n");
        }
        return 0;
    }







    展开全文
  • fill 函数 和 memset函数 小结 1.fill函数 头文件 <algorithm> 按照单元赋值,将一个区间的元素都赋同一个值 函数参数:fill(first,last,val); 原理是把那一块单元赋成指定的值,也就是说任何值都可以 2...
  • memset函数头文件为:C:或 C++:。在用memset为申请的数组赋值时,如果了解他的赋值原理,很有可能会造成一些不必要的隐形错误,令人头疼不已。memset函数在为数组(单个变量也可以)赋值时,是逐个字节赋值的,pt.....
  • fill和memset函数(C++)

    2021-02-25 15:46:12
    memset函数 头文件 #include<string.h> 因为memset函数按照字节填充,所以一般memset只能用来填充char型数组,(因为只有char型占一个字节)如果填充int型数组,除了0和-1,其他的不能。因为只有00000000 = 0...
  • memset 函数的使用

    2018-03-08 07:55:44
    C语言中memset函数头文件为&lt;memory.h&gt; 或 &lt;string.h&gt;C++ &lt;cstring&gt;#include&lt;stdio.h&gt;#include&lt;memory.h&gt; main(){ char a[]="abcd&...
  • memset函数头文件是string.h 在前面不止一次说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码...
  • memset函数用法

    2017-07-25 08:04:26
    memset函数使用详解使用memset函数需要包含头文件string.h 今天做题卡在MEMSET函数的使用上了,本来以为int a[100]; memset(a, MAX,sizeof(a));就是将a数组全部赋值为MAX,现在才知道他的填充是以字节为单位,一般...
  • C++之memset函数

    2019-09-27 13:00:27
    C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 memset()是char型初始化函数。 一. 头文件:<string.h> ...
  • memset函数头文件为: string.h (c++中为 cstring) fill函数 用法: fill(vector.begin(), vector.end(), val); 按照单元赋值,将一个区间内的元素都赋予val值; 实例: #include <iostream> using ...
  • fill函数与memset函数

    2020-04-13 19:49:36
    memset函数是按照字节赋值,一般只能给数组赋初始值0或-1,头文件为#include <string.h>或#include <cstring>,使用方法为memset(数组名,初始值,sizeof(数组名)) fill函数是按照单元赋值,可以将一个...
  • 【C++】fill函数,fill与memset函数的区别 1,memset函数 按照字节填充某字符 在头文件&amp;lt; cstring &amp;gt;里面 2,fill函数 按照单元赋值,将一个区间的元素都赋同一个值 在头文件&amp;lt; ...
  • c++ memset函数

    2019-10-01 03:42:06
    函数所需头文件:#include<cstring> 函数作用:内存赋值函数,用来给某一块内存空间进行赋值的。 函数结构:memset(变量,一个数字,一个数字) 注:第一个数字为赋值大小,第二个数字为所要赋值的字节大小...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 685
精华内容 274
关键字:

memset函数头文件