1. 程式人生 > >重新認識memset函式及c++中陣列的初始化賦值

重新認識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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!