重新认识memset函数及c++中数组的初始化赋值

时间:2022-03-06 22:23:59

今天A题被memset函数坑惨,究其原因,还是自己对这个函数的运用一知半解,才导致出错。

下面就好好重新认识一下这个函数,自己写了测试的代码,memset到底怎么用呢?

先贴测试代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
int main()
{
int n;
int a[10];
char b[10];
memset(a,0,sizeof(a));
for(int i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
//******************************************
memset(a,1,sizeof(a));
for(int i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
//******************************************
memset(a,-1,sizeof(a));
for(int i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
//******************************************
memset(b,'0',sizeof(b));
for(int i=0;i<10;i++)
printf("%c ",b[i]);
printf("\n");
//******************************************
memset(b,'a',sizeof(b));
for(int i=0;i<10;i++)
printf("%c ",b[i]);
printf("\n");
//******************************************
memset(b,'*',sizeof(b));
for(int i=0;i<10;i++)
printf("%c ",b[i]);
printf("\n");
return 0;
}
结果如下图:
重新认识memset函数及c++中数组的初始化赋值
我发现,对数组来说,只能初始化为0,或者-1,其他的时候数字是不正确的。

而对于字符数组来说,任意字符都可以。

字符数组是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而int数组是整型的,使用 memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009

下面摘自百度百科

常见错误

编辑
第一:memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。
第二:memset(void *s, int ch, size_tn);中key实际范围应该在0~~255,因为该函数只能取ch的后八位赋值给你所输入的范围的每个字节,比如int a[5]赋值memset(a,-1,sizeof(int )*5)与memset(a,511,sizeof(int )*5) 所赋值的结果是一样的都为-1;因为-1的二进制码为(11111111 11111111 11111111 11111111)而511的二进制码为(00000000 00000000 00000001 11111111)后八位都为(11111111),所以数组中每个字节,如a[0]含四个字节都被赋值为(11111111),其结果为a[0](11111111 11111111 11111111 11111111),及a[0]=-1,因此无论ch多大只有后八位二进制有效,而八位 二进制 [2]   的范围(0~255)YKQ改。而对字符数组操作时则取后八位赋值给字符数组,其八位值作为 ASCII [3]   码。
第三: 搞反了 ch 和 n 的位置.
一定要记住如果要把一个char a[20]清零,一定是 memset(a,0,20*sizeof(char));
而不是 memset(a,20*sizeof(char),0);
在C++中数组的初始化我也搞错了。。。唉 还是太菜
下面来看一组代码和结果
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
int d[10];
int main()
{
int n;
int a[10]={1};
char b[10]={'a','b'};
int c[10];
//****************************
for(int i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
//****************************
for(int i=0;i<10;i++)
printf("%c ",b[i]);
printf("\n");
//****************************
for(int i=0;i<10;i++)
printf("%d ",c[i]);
printf("\n");
//****************************
for(int i=0;i<10;i++)
printf("%d ",d[i]);
printf("\n");
return 0;
}
重新认识memset函数及c++中数组的初始化赋值
根据结果可以知道
数组a的赋值方式只会给第一个位置赋值,
同样字符数组也是。
而不予赋值时数组里的数字时乱的
当你的数组在全局声明时,自动初始化每一个

C++中数组的初始化我也搞错了。。。唉还是太菜

下面来看一组代码和结果

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
int d[10];
int main()
{
int n;
int a[10]={1};
char b[10]={'a','b'};
int c[10];
//****************************
for(int i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
//****************************
for(int i=0;i<10;i++)
printf("%c ",b[i]);
printf("\n");
//****************************
for(int i=0;i<10;i++)
printf("%d ",c[i]);
printf("\n");
//****************************
for(int i=0;i<10;i++)
printf("%d ",d[i]);
printf("\n");
return 0;
}
重新认识memset函数及c++中数组的初始化赋值

根据结果可以知道

数组a的赋值方式只会给第一个位置赋值,

同样字符数组也是。

而不予赋值时数组里的数字时乱的

当你的数组在全局声明时,自动初始化每一个值为0