为什么要用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的优势就能体现出来了。