zoukankan      html  css  js  c++  java
  • memset 初始化问题 (gcc)

    memset相信总是用c的童鞋不会陌生

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

    原先我总是以为memset是初始化数组的最好方式,比for帅得多,直到最近做了一道题才发现不是这样的。。

    比如:

    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char** argv) {

    int a[5];
    int i;
    memset(a,2,sizeof(a));
    for(i=0;i<5;i++)
    {
    printf("%d \n",a[i]);
    }
    return (EXIT_SUCCESS);
    }

    运行结果;

    
    

    memset是把每个字节的全部内容替换成2,于是int的4个字节(不同编译器可能不一样)就替换成了

    00000010 00000010 00000010 00000010 了,把它换成十进制后就成了2^1+2^9+2^17+2^25

    我算数差,只能靠程序了,代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    int main(int argc, char** argv) {

    printf("%lf",pow(2,1)+pow(2,9)+pow(2,17)+pow(2,25));
    return (EXIT_SUCCESS);
    }

    运行结果:


    而0和-1还是可以用memset的,因为0补完了就是 00000000 00000000 00000000 00000000 还是0

                      -1是 11111111 11111111 11111111 11111111  还是-1

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char** argv) {

    int a[5],b[5];
    int i;
    memset(a,-1,sizeof(a));
    memset(b,0,sizeof(b));
    for(i=0;i<5;i++)
    {
    printf("%d %d\n",a[i],b[i]);
    }
    return (EXIT_SUCCESS);
    }

    运行结果:

    结论:memset在初始化int类型数据时,只能初始化-1和0时才能得到原值,根据定义,它应该是主要初始化字符数组的工具。

  • 相关阅读:
    Day 37 数据库初识
    Day 36 socket并发,协程,进程池与线程池
    Day 35 GIL全局解释器锁,死锁与递归锁,信号量,event事件,线程queue
    DAY 34 进程通信、消费者模型和线程
    09-盒模型
    08-层叠性权重相同处理
    07-css的继承性和层叠性
    06-伪元素选择器
    05-伪类选择器
    04-属性选择器
  • 原文地址:https://www.cnblogs.com/fengyuehan/p/memset.html
Copyright © 2011-2022 走看看