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

2017-11-22 19:49:10来源:CSDN作者:Soul_97人点击

分享

今天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;}
结果如下图:

我发现,对数组来说,只能初始化为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;}

根据结果可以知道数组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;}

根据结果可以知道

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

同样字符数组也是。

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

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



最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台