關於C memset函式使用的問題

2021-08-02 17:24:00 字數 2259 閱讀 1592

1. 關於該函式

函式原型:

memset(void *s,int ch,size_t n)

函式說明:

memset函式是計算機中c/c++語言函式。將s所指向的某一塊記憶體中的前n個

位元組的內容全部設定為ch指定的              

ascii

值, 第乙個值為指定的記憶體位址,塊的大小由第三個

引數指定,這個函式通常為新申請的記憶體做初始化工          作, 其返回值為指向s的

指標。所在標頭檔案或。

2.對於該函式的深入**

該函式的第二個引數ch為進行初始化的值,該值如果的範圍為0到255(00000000到11111111)。如果超過該範         圍

那麼會對該值取後8位。如果ch為字元型,那麼取其ascii碼。

注:以下內容僅針對範圍內,超出範圍按最後8位擷取。

1.對bool陣列進行初始化:

初始化結果為true或false

(1)使用 0或1初始化 

memset(prime,0,sizeof(prime));   0為false,1為true

(2)使用 true或false初始化 

memset(prime,true,sizeof(prime));  true為true,false為false

(3)使用其它值初始化 

memset(prime,『a』,sizeof(prime));  非0值為true,0為false(字元0取ascii碼48,為                

true)

2.對char陣列進行初始化:

(1)使用char型變數。memset(ch,『a』,sizeof(ch));    初始化結果為對應的字元。 

(2)使用int型變數。

將該int值作為ascii碼,使用對應的字元進行初始化。                

(0到127為ascii碼表,其中0為null,128到254未知,應該為擴充套件ascii碼。255顯示字串中字元無效。)

memset(ch,65,sizeof(ch));

memset(ch,0,sizeof(ch));

memset(ch,255,sizeof(ch));

(3)使用bool型變數true或false。(true為ascii碼1,false為ascii碼0,初始結果同int)

3.對int陣列進行初始化:

僅可在初始化的值的最後8位為11111111(255)或00000000(0)時能夠正確進行初始化。也就是說int型陣列 僅

能初始化為-1和0。其餘方法均不能得到正確的結果。

3.挖掘背後的原因

為什麼使用memset函式會出現這些情況呢?原因很簡單就是由於memset函式在做初始化的時候是以位元組           為單位的(1byte,也就是8位二進位制數)。由於bool型別和char型別均為1個位元組。所以在進行初始化的時候不           會發生任何問題(bool型別在存入陣列是會進行型別轉換,0為false,非0為true)。但是乙個int型變數是4個字           節,也就是32位二進位制數。那麼在初始化時會將4個用於初始化的字元組合成乙個int型的值。

例如:使用1進行初始化(memset(num,1,sizeof(num)))

(1) 1的二進位制數為 00000001

(2) memset函式初始化時每個位元組為   

0000000100000001 00000001 00000001 000000010000000100000001 00000001 00000001 ..........

(3) 此時將前4個位元組組合成乙個int的數值,那麼該值為

(16843009)00000001 

00000001 00000001 00000001 

所以當且僅當初始化的值為0(00000000)或-1(......11111 11111111(此時僅會使用最後8位進行初始化))時,4個              位元組進行組合後與初始化的所用的值相同。

寫在最後

第n次在使用這個函式上出現了問題。這一次做乙個詳細的記錄,防止以後忘了。。

Delphi中使用彙編 關於POS函式的問題

在delphi中使用彙編異常的簡單,只用使用關鍵字a end來引導就行了。得到乙個字元在字串中的位置有很多方法,最簡單的就是使用delphi自己的pos函式 另外乙個方法就是使用 迴圈查詢字串陣列的方法,二分法等,這幾種是比較常規的方法,其中建議最好不使用pos函式。因為,雖然使用該函式寫的 是很簡...

Delphi中使用彙編 關於POS函式的問題

在delphi中使用彙編異常的簡單,只用使用關鍵字asm end來引導就行了。得到乙個字元在字串中的位置有很多方法,最簡單的就是使用delphi自己的pos函式 另外乙個方法就是使用 迴圈查詢字串陣列的方法,二分法等,這幾種是比較常規的方法,其中建議最好不使用pos函式。因為,雖然使用該函式寫的 是...

Delphi中使用彙編 關於POS函式的問題

在delphi中使用彙編異常的簡單,只用使用關鍵字asm end來引導就行了。得到乙個字元在字串中的位置有很多方法,最簡單的就是使用delphi自己的pos函式 另外乙個方法就是使用 迴圈查詢字串陣列的方法,二分法等,這幾種是比較常規的方法,其中建議最好不使用pos函式。因為,雖然使用該函式寫的 是...