重新認識memset函式及c 中陣列的初始化賦值

2021-09-05 10:26:12 字數 1951 閱讀 4275

下面就好好重新認識一下這個函式,自己寫了測試的**,memset到底怎麼用呢?

先貼測試**:

#include#include#include#include#include#includeusing namespace std;

int main()

結果如下圖:

我發現,對陣列來說,只能初始化為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++中陣列的初始化

下面來看一組**和結果

根據結果可以知道

陣列a的賦值方式只會給第乙個位置賦值,

同樣字元陣列也是。

而不予賦值時陣列裡的數字時亂的

當你的陣列在全域性宣告時,自動初始化每乙個

ORACLE函式LTRIM 重新認識

大家在使用ltrim時很多是為了去掉字串左邊的空格 如 select ltrim morning from dual morning 最近重新使用此函式時有點新發現 select ltrim morning or from dual morning select ltrim oorning or f...

重新認識C 中new的用法

今天重新看了 effective c 條款7指出上面的if null pintarray 判斷在記憶體申請不成功的情況下,93年以後的編譯器是不會執行一句的,換句話說就是93年前的編譯器要求在記憶體分配失敗時operator new要返回0,而以後的編譯器在記憶體分配失敗時丟擲std bad all...

重新認識js中的instanceof

目錄不少人應該都知道instanceof運算子的作用是檢測物件a是否是物件b的例項,即 a instanceof b但你們知道instanceof是依照什麼來判斷的嗎?答案是 原型鏈如果a物件能夠通過原型鏈到達b物件,instanceof就會返回true,否則返回false function per...