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

下面就好好重新认识一下这个函数,自己写了测试的代码,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的赋值方式只会给第一个位置赋值,
同样字符数组也是。
而不予赋值时数组里的数字时乱的
当你的数组在全局声明时,自动初始化每一个


--------------------- 
作者:yyyan_ 
来源:CSDN 
原文:https://blog.csdn.net/soul_97/article/details/78597953 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/m0_37154839/article/details/85253640