为什么要用memset初始化数组的值?为什么不用数组初始化为0?

问题描述:

#include<stdio.h>
int main(){
    int a[5]={0,1,2}; 
    printf("%d\n",a[4]);//初始化元素默认为0,即使没被定义 
    int b[5];//未初始化元素为随机
    printf("%d\n",b[4]);

    int c[100]={0};
   //等价与memset(c, 0, sizeof(int)*100);,而且写起来很快
   //那为什么在实际中,大家是用下面的
     int c[100];
     memset(c, 0, sizeof(int)*100);
} 

原因一:
int c[100]={0},只能初始化为0,memset可以初始化为0或-1

两者速度一样,都是0.0000sec
赋值为0,建议使用int c[100]={0};,不用写头文件<string.h>,而且写代码速度更快,只需要一行
赋值为-1,只能使用memset(c, 0, sizeof(int)*100);

#include<stdio.h>
#include<time.h>
int main(){
    // 利用初始={0}赋值为0 
    clock_t start,end;
    start = clock();

    int a[99999]={0};
    int b[99999]={0};
    int c[99999]={0};
    int d[99999]={0};
    int e[99999]={0};

    end = clock();
    printf("time=%f\n",(double)((end-start)/CLK_TCK));
} 

#include<stdio.h>
#include<time.h>
#include<string.h>
int main(){
    //用初始memset赋值为0
    clock_t start,end;
    start = clock();

    int a[99999];memset(a, 0, sizeof(int)*99999);
    int b[99999];memset(b, 0, sizeof(int)*99999);
    int c[99999];memset(c, 0, sizeof(int)*99999);
    int d[99999];memset(d, 0, sizeof(int)*99999);
    int e[99999];memset(e, 0, sizeof(int)*99999);

    end = clock();
    printf("time=%f\n",(double)((end-start)/CLK_TCK));
}

memset我记得是只能将数组所有元素赋值为极大值或极小值。
比如int a[100]
memset时就是:
a[1] = 0000;
a[2] = 0000;
...
a[100] = 0000;

memset(a, 1, sizeof(a));
这样写的话,
a[1] = 1111;
a[2] = 1111;
...
a[100] = 1111;
是不对的。
而一般情况下用memset的原因是它采用好像时二进制的计数方法,比直接赋值快。
其实通常两种都可以,只是习惯而已

void * memset(void *buf,int ch,size_t cnt);
在一段内存块中填充给定值( ch 的值只有0和-1有效   vs2019亲测) 对于较大  的结构体和数组的清零  才有更好的效果  

一般 都直接 用0赋值 因为 只要一行代码。 而且开辟的都是不大的内存。
还有很多初始化的函数 哪种用的人多 那它一定就是最简洁的最好用的。

其实这个没有死规定,但是memset效率的确比直接赋值高(尽管也很慢),所以用memset。
还有,用memset也算好习惯。毕竟等将来你编的程序需要处理几千万个变量时,memset的优势就能体现出来了。